ডেস্কটপের জন্য আর্কজিআইএসে কেবলমাত্র কিছু কলামগুলি সিএসভি ফাইলে রফতানি করা হচ্ছে?


15

আমি আরকি ব্যবহার করে একটি পাইথন স্ক্রিপ্ট লিখেছি যা একটি ফাইল জিওডাটাবেজে বহুভুজ বৈশিষ্ট্য শ্রেণিকে আউটপুট করে। আমি পৃথক সিএসভি ফাইলে গুণাবলী রফতানি করতে একটি ফাংশন যুক্ত করেছি। আমি এই পোস্টে যে কোডটি পেয়েছি তা ব্যবহার করছি যা নিখুঁতভাবে কাজ করে। তবে, কোডটি বৈশিষ্ট্য শ্রেণিতে প্রতিটি কলাম রফতানি করে। আমি শুধুমাত্র ক্ষেত্র নিম্নলিখিত নাম আছে না যে রপ্তানি করতে চান: OBJECTID, Shape, অথবা Shape_Length

আমার সিএসভি ফাইলটি সাফল্যের সাথে উত্পন্ন করে এবং এতে সঠিকভাবে ক্ষেত্র বা ক্ষেত্র অন্তর্ভুক্ত হয় না । যাইহোক, ক্ষেত্র হয় ফাইলে লেখা। সেই ক্ষেত্রটিতে লিখিত একটি উদাহরণের মানটি হ'ল: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()

কেউ কি জানেন যে এখানে কী চলছে?


@ এসগ্রিভের পরামর্শ অনুসরণ করতে আমি আমার কোডটি পরিবর্তন করেছি এবং এটি এখনও ফিল্ডটি লিখছিল Shape। যদি ক্ষেত্রের নামগুলি মুদ্রণের জন্য আমি যদি তার মধ্য দিয়ে পুনরাবৃত্তি করে একটি লাইন যুক্ত করি তবে এটি ক্ষেত্র ব্যতীত সমস্ত ক্ষেত্রের তালিকাবদ্ধ করে Shape, তবুও এটি CSV- এ লেখায়। এটি বহুভুজের এক্স এবং ওয়াই স্থানাঙ্ককে দুটি নতুন কলাম হিসাবে যুক্ত করেছে এবং কলামগুলি আর কলামের নামের সাথে একত্রিত হয় না।

আমি লাইনটি পরিবর্তন করেছি যেখানে @ এসগ্রিভ ক্ষেত্রগুলিকে নিম্নলিখিত হিসাবে ঘোষণা করে:

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

নতুন কোডটি ঠিকঠাক কাজ করে তবে সমস্যাটি কী তা এখনও আমি নিশ্চিত নই। কেউ কি জানেন কী চলছে? Shapeমাঠের সাথে কী চুক্তি ?


এখানে কি পাইথন ব্যবহার করা দরকার? স্তর বৈশিষ্ট্যের ক্ষেত্র ট্যাব ব্যবহার করতে চান না এমন ক্ষেত্রগুলি লুকিয়ে রাখা খুব সহজ। তারপরে ওপেন অ্যাট্রিবিউট টেবিল থেকে টেক্সট ফাইলে ডেটা রফতানি করুন (যা সিএসভি) ফর্ম্যাটটি যা আপনি চান না কেবল তা পেতে।
পলিজিও

হ্যাঁ, আমি এটি আমার স্ক্রিপ্টে যুক্ত করা চাই। এটি একটি ক্লায়েন্ট প্রয়োজনীয়তা।
ফেজার

অন্য কেউ কি জানেন যে এখানে কী চলছে? Shapeফিল্ডে ফিল্ডটি কেন লেখা হচ্ছে তা কি কেউ জানেন ? @ এসগ্রিভের কোডটি সম্ভবত আমার কোডকে উন্নত করার সময় এটি সমস্যার সমাধান করেনি।
ফেজার

1
এই জন্য আমার পদ্ধতির ব্যবহার করতে হবে MakeTableView দ্বারা অনুসরণ TableToTable । আপনার দৃষ্টিভঙ্গি যদি সেখানে না পৌঁছে তবে এটি আপনার শেপ ক্ষেত্রটি "হারাতে" যাওয়ার অন্য কোনও উপায় হতে পারে।
পলিজিও

উত্তর:


14

আমি আপনার কোডটি সরল করে দিয়েছি এবং 10.1 তে প্রবর্তিত দা মডিউলটি ব্যবহার করে ত্রুটিটি সংশোধন করেছি । এটি কার্সার ব্যবহার করে ডেটা পঠনকে ব্যাপকভাবে প্রবাহিত করে এবং withকমান্ডের সাথে ব্যবহার করে এই কোডটি ফাইল অ্যাক্সেসের পুরানো পদ্ধতিটি ব্যবহার করা তার চেয়ে বেশি স্থিতিশীল হওয়া উচিত।

এটি সমস্ত ক্ষেত্রের একটি তালিকা তৈরি করে এবং তারপরে তালিকাটি থেকে আপনি চান না এমন ক্ষেত্রগুলি সরিয়ে কাজ করে। এটি তালিকা বোধগম্যতার মধ্যে করা যেতে পারে তবে এটি বেশ অগোছালো এবং অ-পাইথোনিক হবে। একবার কাঙ্ক্ষিত ক্ষেত্রের তালিকা তৈরি হয়ে গেলে এটি da মডিউলের সাহায্যে এই ক্ষেত্রগুলির সমস্ত ডেটা কার্সারে পড়ে। এরপরে সমস্ত ক্ষেত্রের সাথে যুক্ত হওয়ার জন্য অন্য তালিকা বোধগম্যতা ব্যবহার করে এটি লুপ করা যায় এবং ফাইলটিতে লেখা যেতে পারে। এটি 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')

ধন্যবাদ @ এসগ্রিভ আপনার পোস্ট করা কোডটি আমি অনুলিপি করেছিলাম এবং আমি একটি সিএসভি ফাইল পাই যা প্রায় আমার কাছে চাই। তবে কয়েকটি বিষয় আছে। 1. Shapeক্ষেত্রের নামটি এখনও লেখা হচ্ছে তবে শেপের মানগুলি নেই। ২. এখন দুটি নতুন কলাম রয়েছে যেগুলি কার্যকরভাবে কলামগুলি ডানদিকে সরিয়ে নিয়ে সারণির শুরুতে যুক্ত করা হয়েছে। এগুলির কলামগুলি বহুভুজের X এবং Y স্থানাঙ্ক হিসাবে উপস্থিত হয়।
ফেজার

3
ঠিক আছে, আমি মনে করি আমি এটি কাজ করেছি। Shapeক্ষেত্রটি নিয়ে কিছু চলছে - কারণ এটি জ্যামিতির ধরণের। সুতরাং, আমি সেই রেখাটি সংশোধন করেছি যেখানে আপনি fieldsনিম্নলিখিত হিসাবে ঘোষণা করেছেন : fields = [f.name for f in arcpy.ListFields('FinalCadastre') if f.type <> 'Geometry'] এটি কৌশলটি করেছে। যদিও এটি ছাড়া এটি কেন কাজ করছে না তা নিশ্চিত নয়।
ফেজার

2

আমি মনে করি যে আমি একই সমস্যায় পড়েছি এবং কেন আপনার ক্ষেত্র "শেপ" সরানো হচ্ছে না তার কারণটি আবিষ্কার করেছি। এই লুপটি ব্যবহার করার সময়:

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

আমি আবিষ্কার করেছি এটি আসলে প্রতিটি অন্যান্য ক্ষেত্রকে সরিয়ে দিচ্ছে। সুতরাং এটি প্রথমে লুপ হয়ে যাবে, 'OBJECTID' সরিয়ে ফেলবে এবং তারপরে 'শেপ' ক্ষেত্রটি তালিকায় 'OBJECTID' দ্বারা আগে রাখা স্থানে চলে যায়, তাই এটি পরেরটিতে চলে যায় যা পরে 'শেপ_লাইনথ' হবে।

সুতরাং এটি বিশেষত শেপ জ্যামিতিটি ছিল না যা এটিকে অপসারণ করা থেকে বাধা দিচ্ছিল, কেবল এই সত্য যে এই স্ক্রিপ্টটি ব্যবহার করার সময় এটি অন্যান্য প্রতিটি ক্ষেত্রকে সরিয়ে দেয়।


ভাল ধারণা, এক্ষেত্রে বিবৃতি (এলিফ নয়) একাধিক তৈরি করা সমস্যার সমাধান করতে পারে।
ঘুম 6

লুপে কোনও তালিকাটি পরিবর্তন করা ভাল ধারণা নয়। আপনি অপ্রত্যাশিত ফলাফল পেতে পারেন। আমার একই ধরণের সমস্যায় এই পোস্টটি দেখুন ।
ফেজার

0

এর একটি দিকের চাবিকাঠিটি অবজেক্ট আইডি এবং জ্যামিতির অ-ব্যবহারকারী-সংজ্ঞায়িত ক্ষেত্রগুলির জন্য সঠিক নাম নির্ধারণ করা। জ্যামিতি ক্ষেত্রের ধরণটি দ্বিগুণ, যা এই ক্ষেত্রে সহায়তা না করে। বর্ণনা ফাংশনটি ব্যবহার করে, ফাইল ক্ষেত্রগুলির জন্য এই ক্ষেত্রগুলির জন্য সঠিক নাম নির্ধারণ করা যায় (অর্থাত্ শেপফাইল ভি ফাইল জিডিবি ইত্যাদি o

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)]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.