การแยกข้อความจากฟิลด์สตริงก่อนตัวคั่นแต่ละตัวกับฟิลด์ใหม่


9

ฉันพยายามที่จะดึงข้อมูลข้อความจากเขตข้อมูลสตริงที่มีข้อความคั่นด้วยจุดและวางไว้ในสาขาใหม่โดยใช้เครื่องคิดเลขฟิลด์

ฉันใช้ฟังก์ชัน python นี้ (นำมาจากวิธีการแยกข้อความก่อน / ใน QGIS? ):

from qgis.core import *
from qgis.gui import *

@qgsfunction(args='auto', group='Custom')
def func(value1, feature, parent):
    return value1.split('.')[0]

ส่งคืนข้อความทั้งหมดก่อนจุดแรก ตอนนี้ฉันสงสัยว่าจะเขียนฟังก์ชันเพื่อวางแถวข้อความที่คั่นด้วยแต่ละตัวในฟิลด์แยก

ก่อน:

ตาราง

หลังจาก:

ตาราง

คำตอบ:


10

แก้ไข : ฉันแก้ไขคำตอบตามความคิดเห็นบางส่วนโดยJWes


คุณอาจจะเรียกใช้สคริปต์ง่ายจากคอนโซลหลาม ก่อนอื่นให้เปิด Python Console จากPlugins> Python Consoleและเปิดใช้งานปุ่มสำหรับEditor:

ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นโหลดวัตถุ (เวกเตอร์ตาราง ฯลฯ ) ที่จัดเก็บข้อมูลของคุณ

เมื่อคุณทำเสร็จแล้วให้คัดลอกรหัสต่อไปนี้ในEditor:

layer = iface.activeLayer()
fieldindex = layer.fieldNameIndex("Tasks")
layer.startEditing()
for feat in layer.getFeatures():
    if feat[fieldindex]:
        fields = feat[fieldindex].split('.')
        for i in range(1, len(fields)):
            feat[fieldindex + i] = fields[i - 1]
            layer.updateFeature(feat)
    else:
        continue
layer.commitChanges()

จากนั้นเรียกใช้:

ป้อนคำอธิบายรูปภาพที่นี่

คุณจะได้รับสิ่งนี้:

ป้อนคำอธิบายรูปภาพที่นี่

หากคุณต้องการคุณอาจใช้รหัสข้างต้นเป็นฟังก์ชั่น Python สำหรับเครื่องคิดเลขภาคสนาม (ฉันเห็นว่าคุณรู้วิธีการทำแล้ว)


ฉันได้รับข้อความแสดงข้อผิดพลาด: execfile (u'c: /users/jonwes~1/appdata/local/temp/tmpt2lphm.py'.encode ('mbcs')) Traceback (การโทรล่าสุดครั้งล่าสุด): ไฟล์ "<input> ", บรรทัด 1, ใน <module> ไฟล์" c: /users/jonwes~1/appdata/local/temp/tmpt2lphm.py ", บรรทัด 6, ใน <module> feat [" Atg2 "] = ฟิลด์ [2] ดัชนีError : รายการดัชนีอยู่นอกช่วง
JWes

1
สิ่งนี้เกิดขึ้นเพราะคุณอาจมีสตริงที่แตกต่างจากตัวอย่างที่คุณให้ไว้ ข้อผิดพลาดหมายความว่ามีไม่ได้เป็นค่าที่เก็บไว้ในตำแหน่งที่ 2 fieldsของรายการ ฉันถูกไหม?
mgri

ใช่คุณพูดถูกคุณสมบัติบางอย่างมีการคั่นข้อมูลด้วยจุดมากขึ้นกว่าคุณสมบัติอื่น ๆ
JWes

1
หากคุณสามารถให้ไฟล์ตัวอย่างขั้นต่ำ (ที่ฉันสามารถดูว่าข้อมูลของคุณมีโครงสร้าง) ฉันควรจะสามารถปรับรหัสให้เหมาะกับกรณีของคุณ มิฉะนั้นก็จำเป็นต้องเกิดขึ้นอีกครั้งกับเงื่อนไขด้วยตัวคุณเองเพราะมีความเป็นไปได้มากเกินไปที่จะจัดการโดยไม่มีแนวทาง
mgri

ฉันจะอัปเดตคำถามเดิมพร้อมรายละเอียดเพิ่มเติมเกี่ยวกับโครงสร้างข้อมูลแล้ว!
JWes

6

นี่ไม่ใช่วิธีที่มีประสิทธิภาพมาก แต่เป็นวิธีที่ฉันใช้มาก่อน ตรวจสอบให้แน่ใจField2และField3มีอยู่แล้วใช้สิ่งต่อไปนี้:

from qgis.core import *
from qgis.gui import *
import re

@qgsfunction(args='auto', group='Custom')
def func(field, feature, parent):
    # Get active layer
    layer = qgis.utils.iface.activeLayer()
    # Get field indices
    idx_2 = layer.fieldNameIndex('Field2')
    idx_3 = layer.fieldNameIndex('Field3')
    # Extract string values
    first_value = [w for w in re.split('\W', field) if w][0]
    second_value = [w for w in re.split('\W', field) if w][1]
    third_value = [w for w in re.split('\W', field) if w][2]    
    # Update values in fields
    layer.changeAttributeValue(feature.id(), idx_2, second_value)
    layer.changeAttributeValue(feature.id(), idx_3, third_value)
    return first_value

ตัวอย่าง :

  1. นี่คือคุณลักษณะ:

    ตารางคุณสมบัติ

  2. จากนั้นเมื่อบันทึกสคริปต์ของคุณแล้วให้เลือกเพื่ออัปเดตField1และใช้นิพจน์:

    func("Field1")

    ฟังก์ชั่นแก้ไข

  3. ผลลัพธ์:

    ผลลัพธ์


1
เรามีความคิดเดียวกัน! =)
mgri

1
@HowToInQGIS - อันที่จริงแม้ว่าฉันชอบมากวิธีการของคุณเป็นมันเป็นเรื่องง่ายมาก :)
โจเซฟ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.