各区切り文字の前の文字列フィールドから新しいフィールドへのテキストの分割


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コンソールから簡単なスクリプトを実行できます。まず、Plugins> からPythonコンソールを開き、次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'))トレースバック(最新の呼び出しの最後):ファイル "<input> "、1行目<モジュール>ファイル" c:/users/jonwes~1/appdata/local/temp/tmpt2lphm.py "、6行目<モジュール> feat [" Atg2 "] = fields [2] IndexError :リストインデックスが範囲外です
JWes

1
これはおそらく、提供したサンプルとは異なる文字列がいくつかあるためです。エラーは、リストのNo.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-確かに私はあなたの方法の方がはるかに簡単なので、私はずっと好きですが:)
Joseph
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.