각 구분 기호 앞의 문자열 필드에서 새 필드로 텍스트 분할


9

점으로 구분 된 텍스트가 포함 된 문자열 필드에서 텍스트 데이터를 추출하고 필드 계산기를 사용하여 새 필드에 배치하려고합니다.

이 파이썬 함수를 사용하고 있습니다 ( 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의 의견에 따라 답변을 편집했습니다 .


파이썬 콘솔 에서 간단한 스크립트를 실행할 수 있습니다 . 먼저 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')) Traceback (가장 최근 호출) : 파일 "<입력> ", <module> 파일"c : /users/jonwes~1/appdata/local/temp/tmpt2lphm.py "의 6 행, <module>의 6 행 feat ["Atg2 "] = fields [2] IndexError : 목록 색인이 범위를
벗어남

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-실제로 훨씬 더 쉬운 방법을 많이 선호하지만 :)
Joseph
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.