Am einfachen Ende des ETL-Muster-Kontinuums steht das gebräuchlichste Format von allen – CSV, oder durch Kommas getrennte Werte, und sein naher Verwandter, die Excel-Tabelle. Riesige Datenmengen bewegen sich in diesen Formaten – leicht teilbar, für Menschen lesbar – was gibt es in ArcGIS nicht zu mögen? Nun, diese Dinge!
- Kein richtiges Schema im Format eingebaut
- Spaltennamen sind oft in ArcGIS ungültig
- Textfelder mit numerischen Werten werden als numerisch behandelt
- Textfeldbreiten werden auf 8000 (CSV) oder 255 (Excel) Bytes angenommen
- Ganzzahlige Felder können als Gleitkommazahlen doppelter Genauigkeit behandelt werden
- Nullwerte können mit Null oder einem anderen unwahrscheinlichen Wert kodiert sein
- Geometrie ist oft in einem nicht unterstützten Format für die Erstellung von Feature-Classes kodiert
Nehmen Sie diesen beliebten Datensatz von data.gov, gespiegelt vom offenen Datenportal von Washington:
Zuerst die Daten als Karte:
Washington EV Population
Jetzt die Quell-CSV-Datei:
CSV oder Excel Datenprobleme
In Rot hebe ich einige dieser üblichen Verdächtigen hervor. Spaltennamen enthalten Leerzeichen oder Metazeichen, USPS-Postleitzahlen können führende Nullen haben und sollten daher Text sein, Nullen wurden verwendet, um Nullwerte in den Spalten Electric Range und Base MSRP zu kodieren, Vehicle Location ist im WKT-Format und der Census Tract 2020 hat große Ganzzahlen und einen Namen, der mit einer Zahl beginnt.
Der betreffende Datensatz hat Geschwindigkeit – er wird regelmäßig aktualisiert – wenn Sie also daran interessiert sind, ihn oder einen der Tausenden ähnlichen zu verwenden, möchten Sie die Behandlung dieser Probleme mit Geoverarbeitung automatisieren.
Zuerst etwas Recherche! Im Blog-Download befindet sich ein Skriptwerkzeug, das ich verwendet habe, um die CSV-Datei nach maximalen Datenbreiten zu scannen, hier ist der Code:
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"""Eingabetabelle '{tbl}' Feld '{k}' hat maximale Datenbreite '{mDict[k]}'""")
Das ergibt:
Maximale Textfeldbreiten
Abgesehen von der Spalte Postal Code, von der lokales Wissen mir sagt, dass sie 5 Zeichen breit ist, kann ich jetzt die erforderlichen Breiten pro Textfeld sehen.
Ich bin nun in der Lage, ein Schema zu entwerfen, das die betreffende Datei korrekt verarbeitet. Ich habe ModelBuilder gewählt, um meine Verarbeitung zu speichern, da es Kern-Geoverarbeitungs- und Python-Funktionen einbinden kann, die ich verwenden möchte. Das fertige Modell ist dieses, das wir durchgehen werden.
EVPopulation Modell
Die erste Aufgabe ist es, ein entworfenes Schema aufzuzwingen. Dies geschieht mit der Feldzuordnungskontrolle in Export Table, indem die Daten im gewünschten Schema in eine In-Memory-Tabelle kopiert werden. Die Feldzuordnungskontrolle ermöglicht es Ihnen sehr flexibel Felder umzubenennen, umzuwandeln und sogar zu konstruieren.
In diesem Fall gibt es nur ein Quellfeld für jedes Ausgabefeld, daher ist die Aktion immer First, und nur die Feldeigenschaften werden bearbeitet.
Feldzuordnung
Neben Export Table wird die Ausgabefeature-Class unter Verwendung der In-Memory-Tabelle als Vorlage erstellt, Zeilen (noch ohne Geometrie) werden angehängt, dann wird Geometrie aus der WKT-Spalte erzeugt und die zwei Felder mit nullkodierten Nullwerten werden mit Calculate Field-Werkzeugen korrigiert (beachten Sie die bedingte Verarbeitung). Schließlich wird das Feld Vehicle Location als überflüssig entfernt.
Sind wir fertig? Nein! Beste Praxis ist vollständige Automatisierung, und diese Daten kommen aus dem Web.
Die URL, die für den Dateidownload verwendet wird, ist nicht gültig als Geoverarbeitungs-Text File-Eingabe wie vom Modell gewünscht. Es besteht auch das Risiko, dass ein Benutzer eine Eingabe-CSV-Datei mit einem anderen Namen als Electric_Vehicle_Population_Data.csv verwendet, was dazu führen würde, dass die Feldzuordnung in Export Table auf die Standardfeldbehandlung zurückfällt und unsere gesamte Schema-Design-Arbeit rückgängig macht.
Um sowohl Web-Dateneingaben als auch konsistente Dateinamen-Eingaben zu handhaben, ist das Modell EVPopulation in ein übergeordnetes Modell URL2EVPopulation eingebettet:
URL2EVPopulation
Web Download
Zuerst lädt ein Calculate Value-Modellwerkzeug die aktuellen Daten auf eine konsistent benannte Datei vom Typ Text File herunter, dann wird das EVPopulation-Modell aufgerufen, um die Daten zu verarbeiten. Sehen Sie, wie ein sehr einfacher Python-Schnipsel die Automatisierung übernimmt? 😉
Jetzt haben wir automatisierte CSV-Dateiverarbeitung! Ich habe das Konzept der "lokalen bekannten Dateien" etwas gedehnt, indem ich für Daten ins Web gegriffen habe, aber heutzutage sind Dateien im Internet tatsächlich lokal. Ich kann URL2EVPopulation jederzeit planen oder manuell ausführen.
Die Modelle und das Skriptwerkzeug sind im Blog-Download enthalten.