डेस्कटॉप के लिए ArcGIS में CSV फ़ाइल के लिए केवल कुछ कॉलम निर्यात करना?


15

मैंने आर्कपी का उपयोग करते हुए एक पायथन स्क्रिप्ट लिखी है जो एक बहुभुज फीचर क्लास को फाइल जियोडेटाबेस में आउटपुट करता है। मैंने विशेषताओं को एक अलग CSV फ़ाइल में निर्यात करने के लिए एक फ़ंक्शन जोड़ा है। मैं इस पोस्ट में पाए गए कोड का उपयोग कर रहा हूं जो पूरी तरह से काम करता है। हालाँकि, वह कोड फीचर क्लास के हर कॉलम को एक्सपोर्ट करता है। मैं केवल क्षेत्रों में निम्न नाम की जरूरत नहीं है कि निर्यात करना चाहते हैं: OBJECTID, Shape, या Shape_Length

मेरी CSV फ़ाइल सफलतापूर्वक उत्पन्न होती है, और इसमें सही रूप से या फ़ील्ड शामिल नहीं हैं । हालांकि, क्षेत्र है फाइल करने के लिए लिखा है। एक उदाहरण मान जो उस फ़ील्ड में लिखा गया है:OBJECTIDShape_LengthShape

<geoprocessing describe geometry object object at 0x28CB90A0>

मैंने फ़ील्ड नामों को मुद्रित करने के लिए एक पंक्ति जोड़ी है क्योंकि यह उनके माध्यम से पुनरावृत्त करता है और आश्चर्यजनक रूप से, Shapeमुद्रित नहीं होता है। यह ऐसा है जैसे कि आर्कगिस इसे छिपा रहा है या इसे एक अलग नाम देता है।

मेरे फ़ंक्शन का कोड नीचे है:

def exportToTable():
    """ 
        Exports the final outputs to a CSV File.
    """

    # Create path to CSV File (note the varialbe outputPath is declared elsewhere).
    CSVFile = outputPath+'\\FinalOutput.csv'
    arcpy.AddMessage("Created CSV File: %s" %CSVFile)

    # Get all fields in FinalOutput feature class and remove unwanted fields.
    fields = arcpy.ListFields('FinalOutput')
    for field in fields:
        arcpy.AddMessage("Field.name is:"+field.name) #not printing 'Shape' field name
        if field.name in (['OBJECTID', 'Shape', 'Shape_Length']):
            fields.remove(field)

    i = 1
    f=open(CSVFile, 'w')
    for field in fields:
        #--write the wanted field names to the output file
        if i < len(fields):
            f.write('%s,' % field.name)
            i += 1
        else:
            f.write('%s\n' % field.name)

    # Use a search cursor to iterate through the rows of the table and write them to the CSV file.
    rows = arcpy.SearchCursor('FinalOutput')
    for row in rows:
        i = 1
        for field in fields:
            if i < len(fields):
                f.write('%s,' % row.getValue(field.name))
                i += 1
            else:
                f.write('%s\n' % row.getValue(field.name))
    del rows
    f.close()

क्या किसी को पता है कि यहाँ क्या हो रहा है?


मैंने @sgrieve की सलाह का पालन करने के लिए अपने कोड को संशोधित किया और यह अभी भी Shapeक्षेत्र लिख रहा था । के रूप में यह उन के माध्यम से iterates अगर मैं फ़ील्ड नाम मुद्रित करने के लिए एक पंक्ति जोड़ें, यह सभी क्षेत्रों को सूचीबद्ध करता है को छोड़करShape क्षेत्र है, फिर भी यह अभी भी सीएसवी करने के लिए लिखता है। इसने बहुभुज के X और Y निर्देशांक को दो नए स्तंभों के रूप में भी जोड़ा और स्तंभों को स्तंभ नामों के साथ संरेखित नहीं किया गया।

मैंने उस पंक्ति को संशोधित किया है जहाँ @sgrieve निम्नलिखित क्षेत्रों की घोषणा करता है:

fields = [f.name for f in arcpy.ListFields('FinalCadastre') if f.type <> 'Geometry']

नया कोड ठीक काम करता है, लेकिन मैं अभी भी अनिश्चित हूं कि समस्या क्या थी। क्या किसी को पता है कि क्या चल रहा था? Shapeक्षेत्र के साथ क्या सौदा है ?


क्या आपको यहां पायथन का उपयोग करने की आवश्यकता है? उन फ़ील्ड को छुपाना बहुत आसान है जिन्हें आप लेयर प्रॉपर्टीज़ के फ़ील्ड टैब का उपयोग नहीं करना चाहते हैं। फिर खुली विशेषता तालिका से डेटा को पाठ फ़ाइल में निर्यात करें (जो CSV है) केवल उन फ़ील्ड को प्राप्त करने के लिए प्रारूप करें जिन्हें आप चाहते हैं।
PolyGeo

हां, मैं चाहता हूं कि इसे मेरी स्क्रिप्ट में जोड़ा जाए। यह एक ग्राहक की आवश्यकता है।
Fezter

क्या किसी और को पता है कि यहां क्या चल रहा है? क्या किसी को पता है क्योंShape फ़ाइल को फ़ील्ड लिखा जा रहा है? जबकि @ sgrieve के कोड ने संभवतः मेरे कोड में सुधार किया, लेकिन इससे समस्या हल नहीं हुई।
Fezter

1
यह करने के लिए मेरे दृष्टिकोण का उपयोग किया जाएगा MakeTableView के बाद TableToTable । यदि आपका दृष्टिकोण वहाँ नहीं मिलता है तो यह आपके शेप फ़ील्ड को "खो" करने का एक और तरीका हो सकता है।
पॉलीगियो

जवाबों:


14

मैंने आपके कोड को सरल कर दिया है और 10.1 में शुरू किए गए दा मॉड्यूल का उपयोग करके त्रुटि को ठीक किया है । यह कर्सर का उपयोग करके डेटा के पढ़ने को बहुत सुव्यवस्थित करता है, और withकमांड के साथ संयोजन में उपयोग किया जाता है यह कोड अधिक स्थिर होना चाहिए, अगर यह फ़ाइल एक्सेस के पुराने तरीके का उपयोग करता है।

यह सभी क्षेत्रों की सूची बनाकर काम करता है और फिर उन क्षेत्रों को हटा देता है जिन्हें आप सूची से नहीं चाहते हैं। यह सूची समझ के भीतर किया जा सकता है, लेकिन यह बहुत गन्दा और संयुक्त राष्ट्र-पाइथोनिक होगा। एक बार वांछित फ़ील्ड की सूची बना लेने के बाद इसे दा मॉड्यूल के साथ इन फ़ील्ड्स के सभी डेटा को कर्सर में पढ़ने के लिए उपयोग किया जाता है। इसके बाद सभी क्षेत्रों में शामिल होने के लिए एक अन्य सूची समझ का उपयोग करके फ़ाइल के माध्यम से लिखा जा सकता है। इससे 0 से अधिक के किसी भी क्षेत्र के लिए काम करने का लाभ है।

import arcpy

fc = 'C:\\antenna_shp\\cables.shp'
CSVFile = 'C:\\antenna_shp\\FinalOutput.csv'

fields = [f.name for f in arcpy.ListFields(fc)]

for i,f in enumerate(fields):
    if f == 'Shape' or f == 'Shape_Length' or f == 'OBJECTID':
        del fields[i]

with open(CSVFile, 'w') as f:
    f.write(','.join(fields)+'\n') #csv headers
    with arcpy.da.SearchCursor(fc, fields) as cursor:
        for row in cursor:
            f.write(','.join([str(r) for r in row])+'\n')

साभार @sgrieve मैंने आपके द्वारा पोस्ट किए गए कोड की प्रतिलिपि बनाई और मुझे एक सीएसवी फ़ाइल मिली जो लगभग वही है जो मुझे चाहिए। लेकिन कुछ मुद्दे हैं। 1. Shapeफ़ील्ड नाम अभी भी लिखा जा रहा है, लेकिन शेप वैल्यूज़ नहीं हैं। 2. अब दो नए कॉलम हैं जो तालिका की शुरुआत में प्रभावी रूप से कॉलम को दाईं ओर स्थानांतरित कर रहे हैं। वे स्तंभ बहुभुज के X और Y निर्देशांक प्रतीत होते हैं।
Fezter

3
ठीक है, मुझे लगता है कि मैंने इसे पूरा कर लिया है। Shapeमैदान के साथ कुछ चल रहा था - शायद इसलिए कि यह एक ज्यामिति प्रकार है। तो, मैंने उस पंक्ति को संशोधित किया है जहां आप fieldsनिम्नलिखित होने की घोषणा करते हैं: fields = [f.name for f in arcpy.ListFields('FinalCadastre') if f.type <> 'Geometry'] जिसने चाल चली। यकीन नहीं है कि क्यों यह बिना काम नहीं कर रहा था।
Fezter

2

मुझे लगता है कि मैं एक ही समस्या में चला गया हूं और इस कारण की खोज की कि आपके क्षेत्र "आकार" को क्यों नहीं हटाया जा रहा है। इस लूप का उपयोग करते समय:

if field.name in (['OBJECTID', 'Shape', 'Shape_Length']):
    fields.remove(field)

मुझे पता चला है कि यह वास्तव में केवल हर दूसरे क्षेत्र को हटा रहा है। इसलिए यह पहले 'OBJECTID' को हटा देगा, और फिर 'शेप' फ़ील्ड सूची में 'OBJECTID' द्वारा पूर्व में रखे गए स्थान पर चला जाता है, इसलिए यह अगले एक पर चला जाता है, जो बाद में 'Shapebength' होगा।

तो यह विशेष रूप से आकृति ज्यामिति नहीं थी जो इसे हटाने से रोक रही थी, बस यह तथ्य कि यह इस स्क्रिप्ट का उपयोग करते समय हर दूसरे क्षेत्र को हटा देता है।


अच्छा विचार है, जिस स्थिति में अगर बयान नहीं (तो एलिफ्स नहीं) कई समस्या पैदा कर सकते हैं।
नींद 6

किसी सूची को लूप में बदलना अच्छा नहीं है। आपको अप्रत्याशित परिणाम मिल सकते हैं। इस पोस्ट को एक ऐसे ही मुद्दे पर देखें जो मेरे पास था।
Fezter

0

इसके एक पहलू की कुंजी ऑब्जेक्ट आईडी और ज्यामिति के गैर-उपयोगकर्ता-परिभाषित क्षेत्रों के लिए उचित नाम निर्धारित कर रही है। ज्यामिति फ़ील्ड का प्रकार डबल है, जो इस मामले में अप्रभावी है। वर्णन फ़ंक्शन का उपयोग करते हुए, कोई भी इन प्रकारों के लिए फ़ाइल प्रकारों (यानी शेपफाइल वी फाइल जीडीबी, इत्यादि) के लिए उचित नाम निर्धारित कर सकता है; बहुत दुःख को दूर कर सकता है क्योंकि ओड कई बार उसी फ़ाइल प्रकार के भीतर भी बदल जाएगा ...)।

fc = 'path to my featureclass'
desc = arcpy.Describe(fc)
fields = [f.name for f in arcpy.ListFields(fc) if f.name not in (desc.OIDFieldName, desc.areaFieldName, desc.lengthFieldName), desc.shapeFieldName)]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.