Na jednoduchém konci kontinuua ETL vzorů je nejběžnější formát ze všech - CSV, neboli hodnoty oddělené čárkou, a jeho blízký příbuzný, tabulka Excel. Obrovské množství dat se pohybuje v těchto formátech - snadno sdílené, čitelné pro člověka - co by se na tom v ArcGIS nelíbilo? No, právě tyto věci!
- Formát nemá zabudované správné schéma
- Názvy sloupců často nejsou platné v ArcGIS
- Textová pole s číselnými hodnotami jsou považována za číselná
- Šířky textových polí jsou předpokládány jako 8000 (CSV) nebo 255 (Excel) bajtů
- Celočíselná pole mohou být považována za čísla s plovoucí desetinnou čárkou dvojité přesnosti
- Null hodnoty mohou být kódovány nulou nebo jinou nepravděpodobnou hodnotou
- Geometrie je často kódována v nepodporovaném formátu pro vytvoření třídy prvků
Vezměte tento populární dataset z data.gov, zrcadlený z otevřeného datového portálu Washingtonu:
Nejprve data jako mapa:
Washington EV Population
Nyní zdrojový CSV soubor:
CSV nebo Excel problémy s daty
Červeně vybírám některé z těchto obvyklých podezřelých porušení. Názvy sloupců obsahují mezery nebo metaznaky, poštovní směrovací čísla USPS mohou mít vedoucí nuly, takže by měla být textem, nuly byly použity k zakódování null hodnot ve sloupcích Electric Range a Base MSRP, Vehicle Location je ve formátu WKT a 2020 Census Tract má velká celá čísla a název začínající číslem.
Tento dataset má rychlost změn - je pravidelně aktualizován - takže pokud máte zájem jej používat, nebo jakýkoli z tisíců podobných - budete chtít automatizovat řešení těchto problémů pomocí geoprocessingu.
Nejprve trochu výzkumu! V blogovém stahování je skriptový nástroj, který jsem použil ke skenování CSV souboru pro maximální šířky dat, zde je kód:
tbl = arcpy.GetParameterAsText(0)
d = arcpy.da.Describe(tbl)
flds = [f.name for f in d['fields'] if f.type == 'String']
mDict = {f:0 for f in flds}
with arcpy.da.SearchCursor(tbl,flds) as cursor:
for row in cursor:
for f in flds:
if row[flds.index(f)]:
mDict[f] = max(mDict[f],len(row[flds.index(f)]))
for k in mDict.keys():
arcpy.AddMessage(f"""Vstupní tabulka '{tbl}' pole '{k}' má maximální šířku dat '{mDict[k]}'""")
Toto dává:
Maximální šířky textových polí
Ignorujíc sloupec Postal Code, o kterém místní znalost říká, že je široký 5 znaků, nyní vidím požadované šířky pro jednotlivá textová pole.
Nyní mohu navrhnout schéma, které správně zpracuje daný soubor. Zvolil jsem ModelBuilder pro uchování mého zpracování, protože může obalit základní geoprocessingové a Python funkce, které plánuji použít. Hotový model je tento, kterým projdeme.
EVPopulation Model
Prvním krokem je uplatnit navržené schéma. To se provádí pomocí ovládání mapy polí v Export Table, což v podstatě kopíruje data do tabulky v paměti ve vámi požadovaném schématu. Ovládání Field Map umožňuje velmi flexibilně přejmenovávat, převádět a dokonce vytvářet pole.
V tomto případě existuje pouze jedno zdrojové pole pro každé výstupní pole, takže Akce je vždy První, a manipulují se pouze vlastnosti pole.
Mapa polí
Dále po Export Table je výstupní třída prvků vytvořena pomocí tabulky v paměti jako šablony, řádky (stále bez geometrie) jsou k ní připojeny, poté je geometrie vytvořena ze sloupce WKT a dvě pole s nulami zakódovanými jako null jsou opraveny pomocí nástrojů Calculate Field (všimněte si podmíněného zpracování). Nakonec je pole Vehicle Location odstraněno jako nadbytečné.
Jsme hotovi? Ne! Nejlepší praxí je plná automatizace a tato data pocházejí z webu.
URL, která se používá ke stažení souboru, není platná jako vstup typu geoprocessingového Text File, jak model vyžaduje. Existuje také riziko, že uživatel použije vstupní CSV soubor s jiným názvem než Electric_Vehicle_Population_Data.csv, což by způsobilo návrat mapy polí v Export Table k výchozímu zpracování polí a tím by se zrušila veškerá práce na návrhu schématu.
Aby bylo možné zvládnout jak webový vstup dat tak konzistentní název souboru vstupu, model EVPopulation je zabalen do rodičovského modelu URL2EVPopulation:
URL2EVPopulation
Stažení z webu
Nejprve nástroj modelu Calculate Value stáhne aktuální data do konzistentně pojmenovaného souboru typu Text File parametru, poté je zavolán model EVPopulation k jejich zpracování. Vidíte, jak velmi jednoduchý Pythonový útržek zajistí automatizaci? 😉
Nyní máme automatizované zpracování CSV souborů! Trochu jsem rozšířil pojem "místní dobře známé soubory", když jsem sáhl na web pro data, ale dnes jsou soubory po internetu skutečně místní. Mohu kdykoli naplánovat nebo ručně spustit URL2EVPopulation.
Modely a skriptový nástroj jsou v blogovém stahování.