Gelegentlich gibt es eine CSV-Datei, auf der man Abfragen machen möchte. Dazu kann man die Datei in eine Tabellenkalkulation laden oder mit awk, sed, grep, cut usw. hantieren. Wer lieber SQL für die Auswertung verwenden möchte, erledigt das einfach und schnell mit SQLite3 im Terminal. Wider besseres Wissen habe ich vor zwei Jahren eine Python-Anwendung für diesen Zweck geschrieben.
Zum guten Glück habe ich heute einen einfacheren Weg gefunden, der ziemlich offensichtlich ist. Die Datenbank SQLite3 ist bei vielen Distributionen bereits installiert und CSV-fähig. Man startet im Verzeichnis, in dem die CSV-Datei liegt, im Terminal die Datenbank mit dem Befehl sqlite3:
sqlite3
sqlite> .mode csv
sqlite> .import test.csv test
sqlite> .schema
CREATE TABLE IF NOT EXISTS "test"(
"Name" TEXT, "Team" TEXT, "Position" TEXT, "Height" TEXT,
"Weight" TEXT, "Age" TEXT);
sqlite> select * from test where Name like 'Chris S%';
"Chris Shelton",DET,"First Baseman",72,220,26.68
"Chris Stewart",TEX,Catcher,76,205,25.03
"Chris Snyder",ARZ,Catcher,75,220,26.05
"Chris Sampson",HOU,"Relief Pitcher",72,170,28.77
"Chris Snelling",WAS,Outfielder,70,165,25.24
"Chris Schroder",WAS,"Relief Pitcher",75,210,28.53
sqlite> .connection close 1
sqlite> CTRL+D
Dann schaltet man in den CSV-Modus (.mode csv) und liest die CSV-Datei in eine in-memory Tabelle ein (.import test.csv test). Mit .schema wird die Tabellendefinition angezeigt, damit man weiss, nach welchen Spalten man abfragen kann. Und schon kann eine SQL-Abfrage begonnen werden. Wenn man fertig ist, schliesst man die Verbindung mit .connection close 1 und beendet SQLite mit CTRL+D. Weitere SQLite-Befehle findet ihr hier.
Das geht sogar noch viel einfacher. Ich nutze die Funktion sehr häufig, um irgendwelche CSV-Dateien vernünftig durchsuchen zu können. Einfach im Terminal:
echo -e '.separator ";"\n.import DateiName.csv TabellenName' | sqlite3 database.db
Die CSV-Datei sollte natürlich in der ersten Zeile die Feldnamen haben.
Für eine einzelne Tabelle ist das klassische awk vermutlich das bessere Werkzeug, jedoch lassen sich auf die beschriebene Weise auch mehrere CSVs importieren - auch sequenziell in mehreren Schritten, denn die database.db ist ja persistent. Damit eröffnen sich ungeahnte Möglichkeiten, die auch mit Excel/Calc keinen Spaß mehr machen:
Lang lebe die Datenqualitätsanalyse :-) Vielen Dank für den Tipp.
Wenn die CSV-Datei ein anderes Trennzeichen als das Komma verwendet, z. B den Strichpunkt, dann muss man das SQLite irgendwann VOR dem .import Kommando sagen mit: .separator ; (Der vorangestellte Punkt ist wichtig. Er kennzeichnet SQLite-spezifische Steuerkommandos.)
Ich bevorzuge zum Abscließen von SQLite in der SQLite Konsole das SQLite eigene Steuerkommandos ".q" (ohne Anführungszeichen). Das schließt mögliche Konflikte mit Shortcuts von anderen Anwendungen aus und lässt sich auch in Scripts verwenden.
Danke, wusste nicht (mehr?), dass sqlite3 auch direkt CSV kann!
Stellt sich die wichtige Frage (bzgl. Deiner Testdaten), in welchen Einheiten z. B. 72,220,26.68 sind – 72 vermutlich Zoll, 220 vermutlich Pfund, aber Alter „26.68“?