Viac

Importujete aktualizované hodnoty CSV do polí triedy prvkov?

Importujete aktualizované hodnoty CSV do polí triedy prvkov?


Pred časom som mal požiadavku na vyvinutie automatizovanej metódy (Python) na aktualizáciu hodnôt polí pre množinu priestorových bodov v databáze Oracle 11g SDE (exportovanej do GDB na testovanie). Používam Win 7, ArcGIS 10.2, Python 2.7.5. Požiadavka bola vytvoriť výber duplikovaných záznamov a distribuovať export do iných kancelárií, aby príjemcovia označili riadky ako KEEP alebo RETIRE a vrátili mi výpis (csv).

Myšlienka bola, že by som potom mohol použiť csv.dictreader na importovanie výsledkov z 2 požadovaných stĺpcov ('book_id' a 'book_ref') v csv, pričom som ponechal iba výsledky, ktoré spĺňali kritériá = 'KEEP'. Potom som chcel tieto výsledky odovzdať mojej triede prvkov s ďalším vylepšením, iba aktualizáciou existujúcich hodnôt, kde sa číslo súboru CSV „book_id“ zhodovalo s triedou prvkov „book_id“.

Nakoniec som úlohu vykonal ručne, pretože som nemohol získať výsledok z kódu napriek tomu, že som skúmal sekciu pomoci ArcGIS, stovky a stovky príspevkov na tomto webe, geonet, arcpy cafe atď. Atď.

Nakoniec však Dláždil som spolu dosť bitov, aby to vyšlo oustide of work then thought that I post the solution for case others have similar needs.


Obsah súboru 123.csf; book_id TYPE book_ref Status POINT_X POINT_Y 2397 3 3645 Keep 9526430.185 4363958.707 9644 12 2584 Keep 9526427.129 4363961.326 9295 4 4427 odísť 9526421.019 4363963.072 4406 3 3333 Keep 9526461.894 4363968.266 1798 4 1832 odísť 9526461.457 4363974.813 7643 4 1594 Keep 9526407.489 4363966.127 6778 3 8582 odísť 9526412.29 4363968.746 2252 3 3574 Keep 9526367.183 4363972.194 7910 4 5648 Retire 9526402.746 4363934.921 7588 3 9873 Keep 9526401.436 4363928.375 # import modules import arcpy, csv # Set the workspace environment arcpy.env.workspace = "C: / Data / Code / Python / Library / Peter / MAST gdb "ws = arcpy.env.workspace arcpy.env.overwriteOutput = True print" Env.workspace nastavený na: '"+ ws +"' "' n' #feature class in_fc1 =" C: / Data / Code / Python / Knižnica / Peter / MASTER_02.gdb / ZONES / Police "print" Feat_Class: "+ str (in_fc1) +"  n "# To, čo je potrebné urobiť, sa začína tu ... Att_Dict = {} s open (" C: / Data / Code / Python " /Library/Peter/123.csv ") ako f: reader = csv.DictReader (f) pre riadok v čítačke: ak riadok ['Statu s '] ==' Keep ': Att_Dict.update ({riadok [' book_id ']: riadok [' book_ref ']}) print "Att_Dict:" + str (Att_Dict) + " n" # Správne importuje hodnoty ako „Att_Dict“, po ktorom som z 123.csv = ... # {'7643': '7625', '2397': '1835', '7588': '9681', '9644': '2289', '4406 ':' 4443 ',' 2252 ':' 7947 '} Att_List = [] pre kľúč, hodnota v Att_Dict.items (): Att_List.append ([int (kľúč), int (hodnota)]) print "Att_List:" + str (Att_List) + " n" # Správne preformátuje hodnoty Att_Dict ako Att_List na aktualizáciu ... # [[7643, 7625], [2397, 1835], [7588, 9681], [9644, 2289], [4406, 4443], [2252, 7947]] pre pár v Att_List: Att_Dict [pair [0]] = pair [1] fn1 = 'book_id' # názov poľa 1 fn2 = 'book_ref' # názov poľa 2 pole1 = [fn1, fn2 ] # formát funguje s da.UpdateCursor s arcpy.da.UpdateCursor (in_fc1, fields1) ako kurzor: pre riadok v kurzore: pos_1 = riadok [0] # pos_1 sa rovná záznamu v stĺpci [0] ('book_id') v stĺpci fc "Police", ak pos_1 v Att_Dict: # ak stĺpec záznamu v riadku [0] ('book_id') existuje aj v Att_Dict, riadok [1] = o t_Dict [pos_1] # získať zodpovedajúci riadok [1] hodnotu „book_ref“ a prepísať riadok vo fc „Shelves“ cursor.updateRow (riadok) # vykonať aktualizáciu # vymazať objekty kurzora a riadkov, aby sa odstránili zámky v riadku del del, kurzor # a končí tu ...

Kód je kopírovanie a vkladanie, nie prepísanie, takže nič nechýba, a teraz fungoval s mojimi premennými. Najdôležitejšie je, že spĺňa moje požiadavky, aj keď po udalosti. Nemusí to byť práve najelegantnejší kód, ale funguje to a iní môžu z neho získať určitú hodnotu.

UPRAVIŤ

Ak pracujete v SDE, zistil som, že musím pridať reláciu úprav. # Tu je potrebné začať robiť ... Att_Dict = {}

Upravil som na

# Tu je potrebné začať robiť ... # Spustiť reláciu úprav. Musí poskytnúť pracovnú cestu. edit = arcpy.da.Editor (ws) # Relácia úprav sa začala bez zásobníka undo / redo pre dáta s verziou # (pre druhý argument použite False pre dáta bez verzie) edit.startEditing (False, False) # Spustiť operáciu úprav edit .startOperation () Att_Dict = {}

a toto pred # A končí tu ...

# Odstrániť objekty kurzora a riadku, aby sa odstránili zámky v riadku delenia údajov, kurzor # Zastaviť operáciu úprav. edit.stopOperation () # Zastavte reláciu úprav a uložte zmeny edit.stopEditing (True) # A končí tu ...

Pozri si video: Programare Orientata Obiect POO in C++ - Definire clase si supraincarcare operatori