প্রোগ্রামের আকারে টেবিল রেকর্ডের আকারের সংখ্যা = কিনা তা পরীক্ষা করে দেখুন?


9

আমার কাছে মুষ্টিমেয় প্রায় 1000 টি আকারের ফাইল রয়েছে যা দূষিত (সংযুক্ত ত্রুটির বার্তাটি দেখুন)। আকৃতি ফাইলগুলি ইগনিশন বিকাশকারী থেকে তৈরি করা হয়েছিল ৮ There এমন একটি স্ক্রিপ্ট সরঞ্জাম রয়েছে যা মনে হয় শেফফাইলটি দুর্নীতিগ্রস্থ হিসাবে চিহ্নিত হওয়ার পরে এটি পুনরায় মেরামত করতে পারে।

এখানে চিত্র বর্ণনা লিখুন

সম্পাদনা:

আমি আমার সমস্ত শেপফাইলে লুপ করতে একটি দ্রুত স্ক্রিপ্ট তৈরি করতে চাই এবং আকারের সংখ্যাটি টেবিলের রেকর্ডগুলির সাথে মেলে কিনা তা পরীক্ষা করতে চাই। আমি নিম্নলিখিত ব্যবহার করে টেবিলের রেকর্ডগুলি গণনা করতে পারি:

# Name: fcCount.py
# Purpose: calculate the number of features in a featureclass

# Import system modules
import arcpy
from arcpy import env

env.workspace = "C:/data"
Sample = "MyShp.shp"
result_dbf = int(arcpy.GetCount_management(Sample).getOutput(0)) 
print result_dbf

আমি শেষ পর্যন্ত কিছু ধরণের যুক্তিযুক্ত চেক তৈরি করতে চাই:

if result_dbf = result_shp:
    pass
else:
    print "There is a problem with" + str(Sample)

.Dbf ফাইল অ্যাক্সেস না করে আমি কীভাবে সরাসরি আকারগুলি গণনা করতে পারি? অথবা, অন্য কথায়, প্রোগ্রাম আকারে যাচাই করার সর্বোত্তম উপায়টি কী আকারের সংখ্যাটি টেবিল রেকর্ডের সংখ্যার সাথে মেলে কিনা?


1
আমি কল্পনা করি যে ফাইলটি দেখা যাবে, তবে বৈশিষ্ট্য টেবিলের প্রতিটি আইটেমই কোনও অবজেক্ট দ্বারা প্রতিনিধিত্বযোগ্য? এটিই এসবিএন ফাইলটি গ্রহণ করে। এটি সংখ্যাটি মেলে না তা প্রদর্শন করে তা নির্বিশেষে। আমি যা ব্যবহার করি তা শেফফিলারপেইয়ার।
ব্র্যাড নেসোম

1
স্ক্রিপ্টটি ডিকম্পলিং দরকারী হতে পারে, তবে বাহ এটি কিছু পুরানো কোড! আমি সত্যই অবাক হয়েছি এটি আজকের শেফফাইলে এখনও কাজ করে।
পল

1
@ ব্র্যাড আমি সংশোধন করার জন্য পোস্টটি আপডেট করেছি। .Sbn ত্রুটিটি একটি পৃথক সমস্যা যা আমি পেয়েছি এবং এই সমস্যার সাথে সম্পর্কিত নয়।
হারুন

@ ব্র্যাড যখন আমি শেপ চেকারের মাধ্যমে কোনও দূষিত ফাইল চালাই, তখন এটি রিপোর্ট করে: "ডিবিএফ ফাইলে পর্যাপ্ত রেকর্ড নেই - ফাঁকা অংশ যুক্ত করে"।
হারুন

উত্তর:


5

Pyshp ব্যবহার সম্পর্কে কি ? আমি এটি পাইপ দিয়ে ইনস্টল করেছি এবং নীচে যা চেষ্টা করেছি তা হ'ল README থেকে খুব সোজা :

>>> import shapefile
>>> sf = shapefile.Reader("/Users/chad/CoalOutcrops.shp")
>>> shapes = sf.shapes()
>>> len(shapes)
33732
>>> records = sf.records()
>>> len(records)
33732
>>>

দুর্ভাগ্যক্রমে (বা সম্ভবত সৌভাগ্যক্রমে?) আমার কাছে নেই কিনা তা পরীক্ষা করার জন্য কোনও জ্যাকড-আপ শেফফিল নেই। আকারের ক্যান! = না রেকর্ডের।

মাত্র এক মিনিট অপেক্ষা করুন, আমার এখন নীচের মন্তব্যে কर्कের ধারণার জন্য একটি জ্যাক আপ শেফফাইল আছে। আমি ডিবিএফ ব্যাক আপ করেছি, পুরো শেফফিলের একটি অনুলিপি তৈরি করেছি, কিছু বৈশিষ্ট্য মুছে ফেলেছি, তারপর ব্যাকড-আপ ডিবিএফের নাম পরিবর্তন করে মূলতে রেখেছি এবং দেখুন এবং দেখুন আকারের সংখ্যা <রেকর্ডের সংখ্যা:

>>> sf = shapefile.Reader("/Users/chad/CoalOutcrops.shp")
>>> records = sf.records()
>>> len(records)
33732
>>> shapes = sf.shapes()
>>> len(shapes)
33721
>>>

2
হতে পারে শেপ ফাইলের একটি অনুলিপি তৈরি করার চেষ্টা করুন (ফাইলগুলি, আসলে)। তারপরে অনুলিপিটিতে কিছু বৈশিষ্ট্য মুছুন। তারপরে আসল ডিবিএফকে অনুলিপি করা ডিবিএফ (যা কিছু সারি মুছে ফেলেছে) দিয়ে প্রতিস্থাপন করুন।
কুইকেনডাল

@ কির্ককুইএন্ডল - আপনার ধারণাটি কার্যকর হয়েছে, সম্পাদনাগুলি দেখুন। ধন্যবাদ।
চাদ কুপার

7
সমস্যা নেই. আপনার যদি আমার আরও কিছু ডেটা কলুষিত করার প্রয়োজন হয় তবে আমাকে জানান।
কুইকেনডাল

@ চাদ সহায়তার জন্য ধন্যবাদ, শেপফাইল মডিউলটি কৌশলটি করেছে। আমি সফলভাবে আমার শেফফিলগুলি পরীক্ষা করতে ব্যবহৃত চূড়ান্ত স্ক্রিপ্ট পোস্ট করেছি। প্রায় 50/1000 দূষিত ফাইল ছিল।
হারুন

5

আপনার প্রশ্নের শব্দ থেকে মনে হচ্ছে, আপনি আসলে যা করতে চান তা নির্ধারণ করে কোনও শেফফিলের সাথে সমস্যা আছে কিনা (এই ক্ষেত্রে, মিল নেই)। আপনার যদি সমস্যাগুলির সাথে কেবল তাদের চিহ্নিত করতে হয় তবে এটির ত্রুটি রয়েছে কিনা তা নির্ধারণ করার জন্য আপনাকে আসলে ডিবিএফ এবং শেফিলিতে রেকর্ডগুলি গণনা করার দরকার নেই। কারণটা এখানে:

যদি আপনি এমন রেকর্ড গণনা করে এমন একটি শেফফাইলে গেটকাউন্ট ফাংশনটি চালানোর চেষ্টা করেন তবে এটি ত্রুটি সহ ব্যর্থ হবে:

ত্রুটি 000229 : খুলতে পারে না। (গেটকাউন্ট) কার্যকর করতে ব্যর্থ।

যেহেতু গেটকাউন্ট ফাংশনটি এই দৃশ্যে ব্যর্থ হয়েছে এবং আপনি যা করতে চান তা হ'ল ফাইলটিকে ত্রুটিযুক্তভাবে চিহ্নিত করতে পারেন, আপনি যদি / অন্যটি আগে ব্যবহার করার চেষ্টা করছিলেন তবে এর পরিবর্তে আপনি আপনার কোডটিতে একটি ক্লজ / চেষ্টা করে এটি ধরতে পারেন।

আমি "তালিকা ফিচার ক্লাস" কোড এবং লুপ যুক্ত করার স্বাধীনতা নিয়েছি যাতে আপনি প্রতিটি ওয়ার্কপেসে সমস্ত FC এর ম্যানুয়ালি পরীক্ষা না করেই পরীক্ষা করতে পারেন।

# Import system modules
import arcpy
from arcpy import env

env.workspace = "C:/data"

fcList = arcpy.ListFeatureClasses()

for fc in fcList:
    try:
        result_dbf = int(arcpy.GetCount_management(fc).getOutput(0))
        print fc + ": " + str(result_dbf) + " records"
    except:
        print "There is a problem with: " + str(fc)

ধন্যবাদ রায়ান, এটি চাদের সমাধানের একটি ভাল বিকল্প এবং কৌশলটিও করে।
হারুন

2

শেফফাইল ফর্ম্যাটটি নথিভুক্ত করা হয়। আমি অনুমান করব যে shp ফাইলে রেকর্ডের সংখ্যার সাথে ডিবিএফ ফাইলের রেকর্ডের সংখ্যার মিল নেই।

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


ডিবেস ফাইলের সারিগুলি দুটি উপায়ে গণনা করা যায়: (1) শিরোনামের একটি রেকর্ড এতে কতগুলি সারি রয়েছে তা নির্ধারণ করে এবং (২) মোট ফাইলের দৈর্ঘ্য (বাইটে) থেকে শিরোনামের দৈর্ঘ্য বিয়োগ করে এবং রেকর্ড দৈর্ঘ্যের দ্বারা ভাগ করে ( ক্ষেত্রগুলির দৈর্ঘ্যের যোগফলের সমান)। ফাইলটি শারীরিকভাবে কেটে গেলে ক্ষেত্রে উভয় ক্ষেত্রেই করা ভাল। নির্বিশেষে, গণনাগুলি মিললেও, .shp এবং .dbf ফাইলগুলি .shx ফাইল ছাড়াই প্রায় অকেজো হয়, যা .shp ফাইলে সূচক করে। সুতরাং .shx রেকর্ডগুলির গণনাটির একটি দ্রুত চেক পুরো .shp ফাইলটি পড়ার চেয়ে ভাল।
হোবার

2

সংযুক্ত স্ক্রিপ্টটি কোনও ডিরেক্টরিতে লুপ করে এবং শেপগুলির সংখ্যা প্রতিটি শেফফিলের জন্য রেকর্ডের সংখ্যার সাথে মেলে কিনা তা পরীক্ষা করে।

import arcpy, os, shapefile
from arcpy import env

env.workspace = r"C:\path\to\shapefiles"
Dir = env.workspace

fclist = arcpy.ListFeatureClasses()

for fc in fclist:

    myfc = os.path.join(Dir, fc)
    sf = shapefile.Reader(str(myfc))
    shapes = sf.shapes()
    shape_total = len(shapes)
    records = sf.records()
    record_total = len(records)

    if shape_total != record_total:
        print "There is a problem with " + str(fc)
    else:
        print str(fc) + " passed"

1

চেক জ্যামিতি ব্যবহার করে আপনাকে প্রথম পদক্ষেপের মাধ্যমে নেওয়া উচিত।
অনাস
রিপেয়ার জ্যামিতি আপনাকে যে সমস্যার জন্য মেরামত করতে চান তার ক্রম এবং অগ্রাধিকারটি নির্বাচন করার অনুমতি দেবে।
এখানে কিছু অন্যান্য পুরানো সংস্করণ লিঙ্ক আছে । আপনি যখন শেফফাইল চেকার চালাবেন, তারপরে আপনি পুনর্নির্মাণ ডিবিএফ দিয়ে শেষ করবেন?
ম্যাচ রেকর্ড তৈরি যে পদক্ষেপ। দুটি কারণে একটি ত্রুটির কারণ ঘটেছে।

  1. Shp এর একটি অবজেক্ট (স্থানিক) রয়েছে যা অন্য সফ্টওয়্যার / প্রক্রিয়া দ্বারা মুছে ফেলা / বাদ দেওয়া হয়েছে।
  2. ডিবিএফ-এর একটি রেকর্ড রয়েছে যা নাল জ্যামিতিটি উল্লেখ করে।
    বেশ কয়েকটি জিনিস এর কারণ হতে পারে।
    Shx আসলে দুজনের মধ্যে সূচক।
    Dbf রেকর্ড গণনা না করে আকার গণনা করা সমাধানের অর্ধেক মাত্র।

দুর্ভাগ্যক্রমে, জ্যামিতি মেরামত ত্রুটিটি পরিষ্কার করে না।
হারুন

1

এ খুঁজছি shapefiles উইকিপিডিয়ার নিবন্ধ , .shx ফাইল .shp ফাইলে একটি সূচক থাকা উচিত, .dbf ফাইল নয়। সুতরাং .shx এবং .shp একসাথে ফিট কিনা তা যাচাই করা প্রয়োজন হতে পারে।

.Dbf ছাড়াই একটি শেপফিল খোলা সম্ভব (যার অর্থ আপনার কোনও বৈশিষ্ট্য সারণী নেই), তবে একটি ভাঙা সূচকটি একটি ত্রুটি বার্তা উত্পন্ন করবে।


কার দ্বারা এটি "অনুমোদিত নয়"? কেবলমাত্র .shp ফাইল থেকে সমস্ত বৈশিষ্ট্য সম্পর্কিত তথ্য পুনরুদ্ধার করা সম্ভব ।
হোবার

1
এমন একটি সফটওয়্যার দ্বারা যা একটি সুফল কার্যকরী সূচকের প্রত্যাশা করে। সঠিক পদ নয়, আমি উত্তরটি কিছুটা পরিবর্তন করেছি ...
আন্দ্রেজে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.