SIE MÜSSEN DIE TYPENKENNZEICHNUNGEN NICHT INFERENZEN !!!
Sie können direkt aus den DBF-Dateien ableiten, was Sie wollen. Jede Spalte hat einen Namen, einen Typcode (C = Zeichen, N = Zahl, D = Datum (JJJJMMTT), L = Logisch (T/F), plus weitere Typen, wenn die Dateien von Foxpro stammen), eine Länge (falls relevant)), und eine Anzahl von Dezimalstellen (für Typ N).
Welche Software Sie verwendet haben, um die Daten aus den .dbf-Dateien zu ermitteln, die für die Verwendung dieser Informationen erforderlich sind, um alle Daten in den entsprechenden Python-Datentyp zu konvertieren.
Wörterbücher? Warum? Mit einer geringen Menge an Arbeit könnte diese Software modifiziert werden, um eine CREATE TABLE-Anweisung basierend auf diesen Spaltendefinitionen plus eine INSERT-Anweisung für jede Datenzeile zu erzeugen.
Ich nehme an, dass Sie eines der mehreren veröffentlichten Python DBF-Lesemodule verwenden. Jeder von ihnen sollte die Einrichtungen haben, die Sie brauchen: Öffnen Sie eine .dbf-Datei, erhalten Sie die Spaltennamen, erhalten Sie den Spaltentyp etc info, erhalten Sie jede Reihe von Daten. Wenn Sie mit dem Modul, das Sie verwenden, unzufrieden sind, sprechen Sie mit mir; Ich habe eine unveröffentlichte, die, soweit das Lesen von DBFs geht, die besseren Features der anderen kombiniert, die schlimmsten Features vermeidet, so schnell ist, wie Sie es mit einer reinen Python-Implementierung bekommen, alle Visual Foxpro-Datentypen und den _NullFlags-Pseudo behandelt -Spalte, Griffe memoes, etc etc.
HTH
========= Nachtrag: Als ich sagte, Sie nicht Typen zu schließen brauchte, hatte man nicht deutlich gemacht, dass du eine Menge Felder vom Typ C hast, die Zahlen enthielten.
FIPS-Felder: einige sind mit und einige ohne führende Nullen. Wenn Sie sie verwenden, sehen Sie sich dem Problem '012'! = '12'! = 12 gegenüber. Ich würde vorschlagen, die führenden Nullen zu entfernen und sie in ganzzahligen Spalten zu halten, führende Nullen in Berichten wiederherzustellen oder was auch immer, wenn Sie wirklich brauchen. Warum gibt es jeweils 2 Staatsfips und County Fips?
Grundgesamtheit: In der Beispieldatei sind fast alle Ganzzahlen. Vier sind wie 40552.0000, und eine angemessene Anzahl ist leer. Sie scheinen die Bevölkerung für wichtig zu halten und haben gefragt: "Ist es möglich, dass ein kleiner Prozentsatz der Bevölkerung Felder enthält ...?" In Daten ist alles möglich. Wundern Sie sich nicht und spekulieren Sie, untersuchen Sie!Ich rate Ihnen dringend, Ihre Daten in Populationsreihenfolge zu sortieren und sie zu betrachten; Sie werden feststellen, dass mehrere Orte im selben Bundesland die gleiche Bevölkerungszahl teilen. Z.B. Es gibt 35 Orte in New York, deren Pop'n mit 8.008.278 angegeben ist; Sie sind auf 6 Landkreise verteilt. 29 von ihnen haben einen PL_FIPS-Wert von 51000; 5 haben 5100 - sieht aus wie ein Hinter Null Problem :-(
Tipps für die zwischen Schwimmer entscheiden und int: versuchen anum = float (Zeichen) ersten, wenn das gelingt, überprüfen, ob int (anum) == anum
ID: wunderbare "einzigartige ID"; 59 Fälle, wo es kein int - mehrere in Kanada ist (die Website sagte "US-Städte"; ist das ein Artefakt eines ungelösten Grenzstreits?), Einige mit dem Wort ‚Nummer‘, und einige leere
niedrig hängenden Früchte. ich würde das herzuleiten gedacht, dass Bevölkerung in der Tat ganze Zahl betrug 0,1 Zoll über dem Boden war :-)
Es gibt ein schwerwiegender Fehler, dass, wenn alle ([int (value) ... Logik:
>>> all([int(value) for value in "0 1 2 3 4 5 6 7 8 9".split()])
False
>>> all([int(value) for value in "1 2 3 4 5 6 7 8 9".split()])
True
>>>
Sie denken offenbar, dass Sie testen, dass alle Strings umgewandelt werden können, um int, aber du bist Hinzufügen des Fahrers "und alle sind nicht Null". Dito float ein paar Zeilen später.
IOW Wenn es nur einen Nullwert gibt, deklarieren Sie, dass die Spalte keine Ganzzahl ist. Auch nach dem Fixieren, wenn es nur einen leeren Wert gibt, nennt man es varchar. Was ich vorschlage, ist: Zählen Sie, wie viele leer sind (nach der Normalisierung von Leerzeichen (die NBSP enthalten sollte)), wie viele qualifizieren als Integer, wie viele nicht-ganzzahlige Nichtleere als Float qualifizieren, und wie viele "andere". Überprüfen Sie die "anderen"; entscheiden, ob sie ablehnen oder reparieren sollen; wiederholen bis glücklich :-)
Ich hoffe, dass einige davon hilft.
+1, ich würde gerne versuchen, Ihr Modul, wenn es Ihnen nichts ausmacht zu teilen Ich bin mein Benutzername bei Yahoo. Es kann sein, dass ich eine Bibliothek verwende, die wirklich für etwas anderes gedacht ist, ich habe die Selbstantwort für deine Kommentare erweitert, werde hier nachsehen, ob du deinen Beitrag hinzufügen möchtest. – unmounted
Ich schicke es dir später. –
Leider ist dies der beste Datensatz seiner Art, den ich gefunden habe. Bisher keine Nullen in den Testfeldern oder im Fehlerprotokoll, das ich für fehlerhafte Einfügungen verwende. Ich habe in die Daten gegraben und es gibt im Grunde 88 unverbesserliche Reihen, Orte in Colorado und Kanada und NJ mit Dingen wie arithmetischen Operatoren für Namen. Ich bin auf 0,2% Fehlerrate. 88 von 40k + ist in Ordnung, und Kanada sollte sowieso ausgeschlossen werden. "Credit Island, Iowa" wäre allerdings schön. Mein Ziel war es, eine Klasse von Importen zu automatisieren, und ich komme dorthin - ich studiere und verwende Ihr Modul, übrigens, Sie werden viele ... – unmounted