Her sınırlayıcıdan önce bir dize alanından yeni alanlara metin bölme


9

Noktalarla ayrılmış metin içeren bir dize alanından metin verileri ayıklamak ve alan hesap makinesini kullanarak yeni alanlara yerleştirmek çalışıyorum.

Im bu python işlevini kullanarak ( QGIS önce / içinde metin ayıklamak nasıl alınır? ):

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

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

Bu, tüm metni ilk noktadan önce döndürür. Şimdi, ayrılmış her metin satırını ayrı bir alana yerleştirmek için işlevi nasıl yazacağımı merak ediyorum.

Önce:

Tablolar

Sonra:

Tablolar

Yanıtlar:


10

EDIT : Cevabı JWes tarafından yapılan bazı yorumlara göre düzenledim .


Python Konsolu'ndan basit bir komut dosyası çalıştırabilirsiniz . İlk olarak, Plugins> Python Konsolu'nu açın Python Consoleve aşağıdakiler için düğmeyi etkinleştirin Editor:

resim açıklamasını buraya girin

Ardından, verilerinizin depolandığı nesneyi (vektör, tablo vb.) Yükleyin.

Bunu yaptıktan sonra aşağıdaki kodu kopyalayın 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()

ve sonra çalıştırın:

resim açıklamasını buraya girin

Bunu elde edeceksiniz:

resim açıklamasını buraya girin

İsterseniz, alan hesaplayıcısı için yukarıdaki kodu bir Python işlevi olarak kullanabilirsiniz (bunu nasıl yapacağınızı zaten bildiğinizi gördüm).


Hata mesajını alıyorum: execfile (u'c: /users/jonwes~1/appdata/local/temp/tmpt2lphm.py'.encode ('mbcs')) Geri izleme (en son çağrı son): Dosya "<input> ", <module> Dosyasındaki satır 1" c: /users/jonwes~1/appdata/local/temp/tmpt2lphm.py ", satır 6, <module> feat [" Atg2 "] = fields [2] IndexError : liste endeksi aralık dışında
— JWes

1
Bunun nedeni, sağladığınız örnekten farklı bazı dizeleriniz olması olabilir. Hata, listenin No.2 konumunda kayıtlı bir değer olmadığı anlamına gelir fields. Haklı mıyım?
— mgri

Evet haklısınız, temelde bazı özellikler diğer özelliklerden daha fazla nokta ile sınırlandırılmış daha fazla bilgiye sahiptir.
— JWes

1
Minimum örnek dosya sağlayabilirseniz (verilerinizin nasıl yapılandırıldığını görebilirim), kodu davanıza uyarlayabilmeliyim. Aksi takdirde, koşullara kendi başınıza tekrarlamak gerekir, çünkü bir kılavuz olmadan yönetmek için çok fazla olasılık vardır.
— mgri

O zaman orijinal soruyu veri yapısı hakkında daha ayrıntılı olarak güncelleyeceğim!
— JWes

6

Bu çok verimli bir yöntem değil, daha önce kullandığım bir yöntem. Var olduğundan emin olun Field2ve Field3sonra aşağıdakine benzer bir şey kullanın:

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

Örnek :

  1. İşte bir özellik:

    Özellik tablosu

  2. Ardından komut dosyanız kaydedildikten sonra Field1, ifadeyi güncellemek ve kullanmak için seçin :

    func("Field1")

    İşlev düzenleyici

  3. Sonuç:

    Sonuç


1
Aynı fikrimiz vardı! =)
— mgri

1
@HowToInQGIS - Aslında yönteminizi çok daha kolay olduğu için tercih etmeme rağmen :)
— Joseph
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.