SQL auf CSV im Terminal

  Ralf Hersel   Lesezeit: 3 Minuten  🗪 5 Kommentare

SQL-Abfragen im Terminal mit SQLite3.

sql auf csv im terminal

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.

Tags

CSV, SQL, SQLite, Abfrage, Auswertung

Thomas Wacker
Geschrieben von Thomas Wacker am 15. November 2023 um 13:45

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.

Conrad
Geschrieben von Conrad am 16. November 2023 um 10:45

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:

  • Joins - Zuordnungen von Daten
  • die üblichen Vergleiche - welche Sätze sind in Datei 1 aber nicht in Datei 2 und umgekehrt.

Lang lebe die Datenqualitätsanalyse :-) Vielen Dank für den Tipp.

Klaus
Geschrieben von Klaus am 16. November 2023 um 12:22

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.)

Klaus
Geschrieben von Klaus am 16. November 2023 um 14:24

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.

kamome
Geschrieben von kamome am 17. November 2023 um 08:34

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“?