प्रत्येक फ़ील्ड के नए फ़ील्ड से पहले स्ट्रिंग फ़ील्ड से स्प्लिटिंग टेक्स्ट


9

मैं एक स्ट्रिंग फ़ील्ड से टेक्स्ट डेटा निकालने की कोशिश कर रहा हूं जिसमें डॉट्स द्वारा टेक्स्ट सीमांकित किया गया है और फ़ील्ड कैलकुलेटर का उपयोग करके इसे नए फ़ील्ड में रखा गया है।

इस अजगर समारोह का उपयोग कर Im ( QGIS में a / से पहले पाठ कैसे निकाला जाए? )

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

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

यह सभी टेक्स्ट को पहले डॉट से पहले देता है। अब मैं सोच रहा हूं कि प्रत्येक सीमांकित पाठ पंक्ति को एक अलग क्षेत्र में रखने के लिए इसके लिए फ़ंक्शन कैसे लिखें।

इससे पहले:

टेबल्स

उपरांत:

टेबल्स

जवाबों:


10

EDIT : मैंने JWes की कुछ टिप्पणियों के अनुसार उत्तर को संपादित किया ।


आप पायथन कंसोल से एक साधारण स्क्रिप्ट चला सकते हैं । सबसे पहले, 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()

और फिर इसे चलाएं:

यहाँ छवि विवरण दर्ज करें

आप इसे प्राप्त करेंगे:

यहाँ छवि विवरण दर्ज करें

यदि आप पसंद करते हैं, तो आप स्पष्ट रूप से उपरोक्त कोड का उपयोग फ़ील्ड कैलकुलेटर के लिए पायथन फ़ंक्शन के रूप में कर सकते हैं (मैंने देखा कि आप पहले से ही जानते हैं कि कैसे करना है)।


मुझे त्रुटि संदेश मिलता है: निष्पादन योग्य (u'c: /users/jonwes~1/appdata/local/temp/tmpt2lphm.py'.encode ('mbcs')) ट्रैबैक (सबसे हालिया कॉल अंतिम): फ़ाइल "<इनपुट> ", पंक्ति 1, में <मॉड्यूल> फ़ाइल" c: /users/jonwes~1/appdata/local/temp/tmpt2lphm.py ", पंक्ति 6, में <मॉड्यूल> करतब [" Atg2]] = फ़ील्ड [2] IndexError : सूची सूचकांक सीमा से बाहर
JWes

1
ऐसा इसलिए होता है क्योंकि आपके पास संभवतः कुछ तार हैं जो आपके द्वारा प्रदान किए गए नमूने से अलग हैं। त्रुटि का मतलब है कि सूची की स्थिति नंबर 2 में कोई मूल्य संग्रहीत नहीं है fields। क्या मैं सही हू?
माजरी

हां, आप सही हैं, मूल रूप से कुछ विशेषताओं में अन्य सुविधाओं की तुलना में अधिक डॉट्स द्वारा सीमांकित जानकारी है।
JWes

1
यदि आप एक न्यूनतम नमूना फ़ाइल प्रदान कर सकते हैं (जहां मैं देख सकता हूं कि आपका डेटा कैसे संरचित है), तो मुझे आपके मामले में कोड को अनुकूलित करने में सक्षम होना चाहिए। अन्यथा, अपने दम पर सशर्त पुनरावृत्ति करना आवश्यक होना चाहिए क्योंकि दिशानिर्देश के बिना प्रबंधन करने के लिए बहुत अधिक संभावनाएं हैं।
माजरी

मैं डेटा संरचना पर अधिक विवरण के साथ मूल प्रश्न को अपडेट करूंगा!
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
हमारा भी यही विचार था! =)
मिलीग्राम

1
@HowToInQGIS - वास्तव में यद्यपि मैं आपकी विधि को पसंद करता हूँ क्योंकि यह बहुत आसान है :)
जोसेफ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.