Tách văn bản từ một trường chuỗi trước mỗi dấu phân cách sang các trường mới


9

Tôi đang cố trích xuất dữ liệu văn bản từ trường chuỗi chứa văn bản được phân tách bằng dấu chấm và đặt nó vào trường mới bằng máy tính trường.

Tôi đang sử dụng chức năng python này (Lấy từ Cách trích xuất văn bản trước a / trong QGIS? ):

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

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

Điều này trả về tất cả văn bản trước dấu chấm đầu tiên. Bây giờ tôi đang tự hỏi làm thế nào để viết hàm cho nó để đặt từng hàng văn bản được phân tách trong một trường riêng biệt.

Trước:

Những cái bàn

Sau:

Những cái bàn

Câu trả lời:


10

EDIT : Tôi đã chỉnh sửa câu trả lời theo một số ý kiến ​​của JWes .


Bạn có thể chạy một tập lệnh đơn giản từ Bảng điều khiển Python . Đầu tiên, mở Bảng điều khiển Python từ Plugins> Python Consolevà kích hoạt nút cho Editor:

nhập mô tả hình ảnh ở đây

Sau đó, tải đối tượng (một vectơ, bảng, v.v.) nơi dữ liệu của bạn được lưu trữ.

Một khi bạn đã làm điều này, sao chép mã sau đây trong 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()

và sau đó chạy nó:

nhập mô tả hình ảnh ở đây

Bạn sẽ có được điều này:

nhập mô tả hình ảnh ở đây

Nếu bạn thích, rõ ràng bạn có thể sử dụng mã trên làm hàm Python cho máy tính trường (tôi thấy rằng bạn đã biết cách thực hiện).


Tôi nhận được thông báo lỗi: execfile (u'c: /users/jonwes~1/appdata/local/temp/tmpt2lphm.py'.encode ('mbcs')) TracBack (cuộc gọi gần đây nhất gần đây): Tệp "<input> ", dòng 1, trong <module> Tệp" c: /users/jonwes~1/appdata/local/temp/tmpt2lphm.py ", dòng 6, trong <module> feat [" Atg2 "] = các trường [2] IndexError : liệt kê chỉ số ngoài phạm vi
JWes

1
Điều này xảy ra bởi vì bạn có thể có một số chuỗi khác với mẫu bạn đã cung cấp. Lỗi có nghĩa là không có giá trị được lưu trữ ở vị trí số 2 của danh sách fields. Tôi có đúng không
mgri

Có, bạn nói đúng, về cơ bản, một số tính năng có nhiều thông tin được giới hạn bởi nhiều dấu chấm hơn các tính năng khác.
JWes

1
Nếu bạn có thể cung cấp một tệp mẫu tối thiểu (nơi tôi có thể xem dữ liệu của bạn được cấu trúc như thế nào), tôi sẽ có thể điều chỉnh mã theo trường hợp của bạn. Mặt khác, bạn cần phải tự mình kiểm tra lại các điều kiện vì có quá nhiều khả năng để quản lý mà không có hướng dẫn.
mgri

Tôi sẽ cập nhật câu hỏi ban đầu với chi tiết hơn về cấu trúc dữ liệu!
JWes

6

Đây không phải là một phương pháp rất hiệu quả nhưng là một phương pháp tôi đã sử dụng trước đây. Hãy chắc chắn Field2Field3tồn tại sau đó sử dụng một cái gì đó như sau:

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

Ví dụ :

  1. Đây là một thuộc tính:

    Bảng thuộc tính

  2. Sau đó, khi tập lệnh của bạn đã được lưu, chọn để cập nhật Field1và sử dụng biểu thức:

    func("Field1")

    Chức năng chỉnh sửa

  3. Kết quả:

    Kết quả


1
Chúng tôi đã có cùng một ý tưởng! =)
mgri

1
@HowToInQGIS - Thật vậy, mặc dù tôi rất thích phương pháp của bạn vì nó dễ dàng hơn rất nhiều :)
Joseph
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.