আরকিপি এর ধারা যেখানে পরিবর্তনশীল সহ? নির্বাচন করুন_আনালাইসিস ()?


21

আমি একটি শেফফিলের মধ্য দিয়ে লুপ করার চেষ্টা করছি, প্রতিটি বৈশিষ্ট্য ঘুরেফিরে বেছে নিয়ে এবং ইউনিয়ন বিশ্লেষণে অন্তর্ভুক্ত করে একটি অস্থায়ী শেফফাইলে অনুলিপি করছি। আমি প্রতিটি বৈশিষ্ট্যের জন্য আইডি নামটি খুঁজে বের করতে একটি কার্সার ব্যবহার করছি যা আমি একটি চলক 'নাম' এ সেট করছি। যখনই আমি এই পরিবর্তনশীলটিকে আরকিপি-র শৃঙ্খলার অংশ হিসাবে ব্যবহার করার চেষ্টা করি তখনই আমি একটি ত্রুটি পাই:

এক্সিকিউটিয়ার: ERROR 999999: ফাংশন সম্পাদন করতে ত্রুটি। একটি অবৈধ এসকিউএল বিবৃতি ব্যবহৃত হয়েছিল। একটি অবৈধ এসকিউএল বিবৃতি ব্যবহৃত হয়েছিল। কার্যকর করতে ব্যর্থ (নির্বাচন করুন)।

আমি যে কোডটি ব্যবহার করছি তা হ'ল:

Name = 101
where = "\'\"StudyID\" = \\'"+str(Name)+"\\'\'"
arcpy.Select_analysis("C:\\input.shp", "C:\\output.shp", where)

আমি যদি ভেরিয়েবলগুলি না ব্যবহার করে টাইপ করি:

arcpy.Select_analysis("C:\\input.shp", "C:\\output.shp", '"StudyID" = \'101\'')

এটা ঠিক কাজ করে

স্কের স্টেটমেন্টের সাথে ভেরিয়েবলটি ফিট করার জন্য আমাকে কী করতে হবে?

উত্তর:


14

আরেকটি, সম্ভবত সহজ উপায়:

where = '"StudyID" = ' + "'%s'" %Name

2
"আরকিজিআইএস 10 ব্যবহার করার সময় (বা সম্ভবত: পরে), ক্ষেত্রের নামগুলি উদ্ধৃত করার দরকার নেই" এটি ভুল; ক্ষেত্রের ডিলিমিটারগুলি অবশ্যই অন্তর্নিহিত ডিবিএমএসের বাক্য গঠন নিয়ম অনুসারে নির্দিষ্ট করতে হবে। আমার উত্তর দেখুন।
blah238

উপরের মন্তব্যটি একটি অনামী সম্পাদনার প্রতিক্রিয়া হিসাবে ছিল যা আমি এই উত্তরটির সঠিকতার জন্য ফিরে এসেছি।
blah238

যদি Nameব্যবহারকারী ইনপুট থেকে আসে তবে এটি কি এসকিউএল ইঞ্জেকশন দুর্বলতা নয় ?
jpmc26

22

একটি জিনিস যা WHERE ক্লজগুলি লেখার পক্ষে অনেক সহজ করে তোলে তা হ'ল AddFieldDelimitersফাংশনটি ব্যবহার করা যা স্বয়ংক্রিয়ভাবে ক্ষেত্র শনাক্তকারীদের জন্য সঠিক, ডিবিএমএস-নির্দিষ্ট সীমানার যুক্ত করে, যেমন FGDB এর জন্য ডাবল-কোট এবং PGDB এর জন্য বন্ধনী।

আপনার অন্য যে জিনিসটি বিবেচনা করতে হবে তা হ'ল মানটি কোনও সংখ্যা, স্ট্রিং বা অন্যান্য ডেটা ধরণের whether বিশেষত, স্ট্রিংগুলি একক উদ্ধৃতিতে মোড়ানো হয় যখন সংখ্যাগুলি হয় না। আপনি ক্ষেত্রের প্রকারটি পরীক্ষা করতে পারেন এবং এটি যদি স্ট্রিংয়ের ক্ষেত্র হয় তবে একক উদ্ধৃতি যোগ করতে পারেন।

উদাহরণ:

import arcpy

def buildWhereClause(table, field, value):
    """Constructs a SQL WHERE clause to select rows having the specified value
    within a given field and table."""

    # Add DBMS-specific field delimiters
    fieldDelimited = arcpy.AddFieldDelimiters(table, field)

    # Determine field type
    fieldType = arcpy.ListFields(table, field)[0].type

    # Add single-quotes for string field values
    if str(fieldType) == 'String':
        value = "'%s'" % value

    # Format WHERE clause
    whereClause = "%s = %s" % (fieldDelimited, value)
    return whereClause

if __name__ == "__main__":
    inputfc = r"C:\input.shp"
    outputfc = r"C:\output.shp"
    fieldname = "StudyID"
    fieldvalue = 101
    whereclause = buildWhereClause(inputfc, fieldname, fieldvalue)
    arcpy.Select_analysis(inputfc, outputfc, whereclause)

আরও দেখুন ফাংশন এই উত্তরটি উপরের ফাংশন একটি বহু-মান সংস্করণের জন্য।


2
ভালো বুদ্ধি. আমি আমার আরকি হেল্পার ফাংশন মডিউলে এই ফাংশনটি যুক্ত করেছি যাতে এটি
আরকিপি-বিল্ড ওয়ার্ল্ড

3

এটা চেষ্টা কর:

Name = 1
study = "StudyID"

where = '"' + study + '" = ' + "'" + str(Name) + "'"

0

আমি ট্রিপল কোট ব্যবহার করতে চাই। আমার মনে হয় এগুলি পড়ার পক্ষে সহজ। উদাহরণ স্বরূপ,

name = 101
where = """ "StudyID" = '%s' """ % name
arcpy.Select_analysis("C:\\input.shp", "C:\\output.shp", where)

আপনার উপর নির্ভর করে type(name)আপনার 'চারপাশের প্রয়োজন হতে পারে বা নাও পারে %s। সংখ্যার জন্য, আপনার 'পাঠ্যের প্রয়োজন নেই তবে প্রয়োজন ।


0

আমার জন্য, এই সমাধানটি সবচেয়ে ভাল কাজ করে কারণ আমি আগ্রহ এবং মানদণ্ডের ক্ষেত্রের ক্ষেত্রে উভয়কেই পরিবর্তন করতে পারি।

field = "Sport"
value = "Basketball"
where = """"{}" = '{}'""".format(field,value)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.