আরকিপি এবং পাইথন ব্যবহার করে অ্যাট্রিবিউট টেবিলগুলিতে অ-ইংরাজী অক্ষর প্রতিস্থাপন করছেন?


9

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

তবে, অক্ষরগুলির পরিবর্তনটি ঠিকঠাক কাজ করে তবে ক্ষেত্রটি আরকিপি.আপডেট কার্সার দিয়ে আপডেট করে না।

এটি সমাধানের উপযুক্ত উপায় কী?

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

ত্রুটির বার্তা:
রানটাইম ত্রুটি ট্রেসব্যাক (সর্বশেষতম কল): ফাইল "", লাইন 1, ফাইল "সি: /gis/python/teststring.py", লাইন 28, ভাল = কোডে (str (prow.Typkod)) ইউনিকোড এনকোড এরির: 'এসকিআই' কোডেক আপনি অক্ষরটি এনকোড করতে পারবেন না '\ xc4' পজিশনে 3: সীমিত সীমানায় নেই (128)

কোড:

# -*- coding: cp1252 -*-
def code(infield):
    data = ''
    for i in infield:
##        print i
        if i == 'Ä':
            data = data + 'AE'
        elif i == 'ä':
            data = data + 'ae'
        elif i == 'Å':
            data = data + 'AA'
        elif i == 'å':
            data = data + 'aa'
        elif i == 'Ö':
            data = data + 'OE'
        elif i == 'ö':
            data = data + 'oe'
        else:
            data = data + i
    return data


shp = r'O:\XXX\250000\DB\ArcView\shape.shp'

prows = arcpy.UpdateCursor(shp)

for prow in prows:
    val = code(unicode(str(prow.Typkod), "utf-8"))
    prow.Typkod_U = val
    print val
    prows.updateRow(prow)

টাইপকডের মানগুলি ধরণের হয়: [D, D, S, DDRÄ, TRÄ] ইত্যাদি

আমি উইন্ডোজ 7 এ আর্কম্যাপ বেসিক (10.1) ব্যবহার করি।


নতুন ত্রুটি বার্তা:
রানটাইম ত্রুটি ট্রেসব্যাক (সর্বশেষতম কল): ফাইল "", লাইন 1, ফাইল "সি: /gis/python/teststring.py", লাইন 29, ভাল = কোডে (ইউনিকোড (টিআর (সারি))। টাইপকড), "ইউটিএফ -8")) ইউনিকোড এনকোড এরর: 'এসকিআই' কোডেক আপনি অক্ষরের এনকোড করতে পারবেন না '' xc4 'পজিশনে 3: সীমানায় নেই (128)

>>> val 'DDRÄ'
>>> type(val) টাইপ 'str'


এটি প্রদর্শিত হয় যেন ফাংশন থেকে আউটপুটটি কোনওভাবে ভুল। জড়িত থাকলে এটি ফিরে আসে data = u'DDR\xc4'এবং না (যেমন আমার উদ্দেশ্য ছিল) data = 'DDRAE'। এর কারণ হতে পারে এমন কোনও পরামর্শ?

উত্তর:


7

আমি প্রায়শই বিশেষ অক্ষর যেমন আপনার সুইডিশ (ä, ö, å) এর সাথে কাজ করি তবে অন্যান্য কিছু ভাষা যেমন পর্তুগিজ এবং স্প্যানিশ (é, í, ú, ó ইত্যাদি) তে উপস্থাপন করে যাচ্ছি। উদাহরণস্বরূপ, আমার কাছে ডেটা রয়েছে যেখানে সমস্ত নাম মুছে ফেলা সহ নগরের নামটি সরল লাতিন ভাষায় লেখা আছে, সুতরাং "গেটেবার্গ" "গোটেবার্গ" হয়ে যায় এবং ""re" হ'ল "। যোগদানের জন্য এবং ডেটা মেলে দেখার জন্য আমাকে অ্যাকসেন্টগুলি ইংরেজী ল্যাটিন-ভিত্তিক চরিত্রটিতে প্রতিস্থাপন করতে হবে।

আপনি প্রথমে নিজের জবাব হিসাবে যেমনটি দেখিয়েছিলেন আমি এটি করতাম তবে এই যুক্তিটি শীঘ্রই বজায় রাখা বরং জটিল হয়ে উঠবে। এখন আমি ইউনিকোডেডাটা মডিউলটি ব্যবহার করি যা বৈশিষ্ট্যগুলি পুনরাবৃত্তি করার জন্য পাইথন ইনস্টলেশন এবং আরকিপি সহ ইতিমধ্যে উপলব্ধ।

import unicodedata
import arcpy
import os

def strip_accents(s):
   return ''.join(c for c in unicodedata.normalize('NFD', s)
                  if unicodedata.category(c) != 'Mn')

arcpy.env.workspace = r"C:\TempData_processed.gdb"
workspace = arcpy.env.workspace

in_fc = os.path.join(workspace,"FC")
fields = ["Adm_name","Adm_Latin"]
with arcpy.da.UpdateCursor(in_fc,fields) as upd_cursor:
    for row in upd_cursor:
        row[1] = strip_accents(u"{0}".format(row[0]))
        upd_cursor.updateRow(row)

ইউনিকোডেডাটা মডিউলটি ব্যবহারের বিষয়ে আরও তথ্যের জন্য লিঙ্কটি দেখুন পাইথনের ইউনিকোড স্ট্রিংয়ে অ্যাকসেন্টগুলি সরিয়ে ফেলার সেরা উপায় কী?


আমি দেখতে পাচ্ছি যে এটি কীভাবে কার্যকর হতে পারে তবে যদি আমাদের চরিত্রগুলি যেমন রাখা দরকার হয় তবে কী হয়? আমরা এই বিশেষ চরিত্র রাখতে কিছু যাদু করতে পারি?
বোগদান মিরসিয়া স্টানসিউ

6

বার বার ঘুরে দেখা যায় that এত সহজ ছিল না। এটি একটি ইউনিকোড স্ট্রিং হিসাবে উল্লেখ করা হয়, এবং if-বিবৃতিগুলি যা আক্ষরিক instead এর পরিবর্তে ব্যবহার করতে হয় তা পরীক্ষা করার সময় ÅÄÖ আমি এটি বের করার পরে, বাকিটি কেকের টুকরো ছিল :)

ফলাফলের কোড:

# -*- coding: cp1252 -*-
def code(infield):
    data = ''
    for i in infield:
##        print i
        if i == u'\xc4': 
            data = data + 'AE'
        elif i == u'\xe4': 
            data = data + 'ae'
        elif i == u'\xc5': 
            data = data + 'AA'
        elif i == u'\xe5': 
            data = data + 'aa'
        elif i == u'\xd6': 
            data = data + 'OE'
        elif i == u'\xf6': 
            data = data + 'oe'
        else:
            data = data + i
    return data


shp = arcpy.GetParameterAsText(0)
field = arcpy.GetParameterAsText(1)
newfield = field + '_U'
arcpy.AddField_management(shp, newfield, 'TEXT')

prows = arcpy.UpdateCursor(shp)

for row in prows:
    row.newfield = code(row.field)
    prows.updateRow(row)

1

নিম্নলিখিতগুলি কাজ করে কিনা তা দেখুন:

val = code(unicode(str(prow.Typkod), "utf-8")

ধন্যবাদ! এটি বরাদ্দকরণে সহায়তা করেছিল val, তবে এটি বর্তমান সারিটিতে (নিম্নলিখিত পংক্তিতে) লেখার জন্য নয়। [এই পরিবর্তনটি দিয়ে প্রশ্ন আপডেট করা হচ্ছে]]
মার্টিন

আপনার অর্থ এই লাইনটি এখন ব্যর্থ হয়েছে: prow.Typkod_U = ভাল? একই ত্রুটি দিয়ে? সুতরাং রূপান্তর পরে ভাল মান কি?
ম্যাপোহোলিক

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