Importieren Sie CSV in SQLite


117

Ich versuche, eine CSV-Datei in eine SQLite-Tabelle zu importieren.

Beispiel csv:

1,2
5,6
2,7

Beispielbefehl:

sqlite> create table foo(a, b);
sqlite> .separator ,
sqlite> .import test.csv foo
Error: test.csv line 1: expected 2 columns of data but found 4

Ich bin mir nicht mal sicher, warum es vier Spalten mit sechs Daten und zwei Spalten finden würde.


Es scheint, dass der Befehl Spaltenüberschriften in der ersten Zeile erwartet und dass der Zeilenabschluss nicht als solcher erkannt wird. 6 - 2 = 4
mechanisches

Kann ich einen Zeilenabschluss angeben oder fehlt einer in meiner CSV?
Molly Walters

1
Es sieht nicht so aus, als könnten Sie den Zeilenabschluss über das SQLite-Befehlszeilentool angeben. Haben Sie einen Texteditor (wie Notepad unter Windows, aber besser), der Ihnen die Zeilenabschlusszeichen anzeigt? Es gibt drei Hauptvarianten: \r\nunter Windows, \nunter * nix (einschließlich neuerer Macs), \runter älteren Macs.
mechanisches

Ich verwende BBEdit, sehe aber keine dieser Zeichen am Ende der Zeilen. Ich habe versucht, sie manuell hinzuzufügen, aber es scheint nichts zu tun ...
Molly Walters

1
Diese Website kann eine CSV- (oder Excel-) Datei in SQLite - converttosqlite.com
Code Slinger

Antworten:


153

Was auch in den Kommentaren gesagt wird, SQLite sieht Ihre Eingabe als 1, 25, 62, 7. Ich hatte auch ein Problem mit und in meinem Fall wurde es gelöst, indem "Trennzeichen" in ".mode csv" geändert wurde. Sie könnten also versuchen:

sqlite> create table foo(a, b);
sqlite> .mode csv
sqlite> .import test.csv foo

Der erste Befehl erstellt die Spaltennamen für die Tabelle. Wenn Sie jedoch möchten, dass die Spaltennamen von der CSV-Datei geerbt werden, können Sie die erste Zeile einfach ignorieren.


83
Wenn für andere Personen, die bei einer Suche hier landen, die erste Zeile Ihrer CSV-Datei die Spaltennamen enthält, können Sie den ersten create tableBefehl weglassen, und SQLite verwendet die Spaltennamen aus der CSV-Datei.
EarlCrapstone

2
@EarlCrapstone: Könnten Sie näher darauf eingehen? Es scheint bei mir nicht zu funktionieren.
d33tah

3
@ d33tah Schau dir diese Beispiele an . Beachten Sie, dass die erste Zeile die Spaltennamen Year,Make,Model,Description,Priceund nicht die tatsächlichen Daten enthält. Wenn dies bei Ihrer CSV-Datei der Fall ist, müssen Sie die Tabelle nicht manuell mit dem create tableBefehl erstellen . Der .importBefehl verwendet die erste Zeile in Ihrer Datei, um die Spaltennamen zu ermitteln und die Tabelle entsprechend zu erstellen. Sie müssen noch den Namen der Tabelle in den Befehl aufnehmen. Die gleichen Informationen aus den SQLite-Dokumenten .
EarlCrapstone

Warum stellst du ein .mode? Ist das nicht nur für die Ausgabe?
Alan

Wenn Sie feststellen, dass die generierte Tabelle mehrere Spalten zusammenfasst, stellen Sie sicher, dass Sie kein reserviertes Wort verwenden, z. B. typefür einen CSV-Spaltennamen.
Paulvs

29

So habe ich es gemacht.

  • Erstellen / Konvertieren einer CSV-Datei, die durch Tabulatoren (\ t) getrennt und nicht in Anführungszeichen eingeschlossen werden soll (SQLite interpretiert Anführungszeichen wörtlich - sagt alte Dokumente)
  • Geben Sie die SQLite-Shell der Datenbank ein, zu der die Daten hinzugefügt werden müssen

    sqlite> .separator "\t" ---IMPORTANT! should be in double quotes sqlite> .import afile.csv tablename-to-import-to


Für mehrere Zeilen musste mein tsv das ROW-Trennzeichen mit diesem Befehl angeben .separator "\t" "\r"
mfink

1
Bei der Erörterung von Dateiformaten gilt tsv! = CSs.
Alan

24

Ich füge hier Informationen aus früheren Antworten mit meiner eigenen Erfahrung zusammen. Am einfachsten ist es, die durch Kommas getrennten Tabellenüberschriften direkt zu Ihrer CSV-Datei hinzuzufügen, gefolgt von einer neuen Zeile und dann allen Ihren CSV-Daten.

Wenn Sie nie wieder SQLite-Inhalte ausführen (wie ich), ersparen Sie sich möglicherweise ein oder zwei Websuchen:

Geben Sie in die Sqlite-Shell Folgendes ein:

$ sqlite3 yourfile.sqlite
sqlite>  .mode csv
sqlite>  .import test.csv yourtable
sqlite>  .exit

Wenn Sie Sqlite nicht auf Ihrem Mac installiert haben, führen Sie es aus

$ brew install sqlite3

Möglicherweise müssen Sie eine Websuche durchführen, um Homebrew zu installieren.


1
Wie gehe unescaped " characterich mit Warnungen um?
TMOTTM

Wenn Sie vor dem Import eine Tabelle erstellen, wird nicht nach Headern gesucht.
Rolf

Ich muss die Datei in denselben Ordner legen, in dem sich sqlite3.exe befindet. Kann ich einen anderen Pfad für die CSV-Datei verwenden?
Jaydeep Karena

Kleiner Punkt: "Wenn Sie Sqlite nicht auf Ihrem Mac installiert haben" ... AFAIK ist es standardmäßig installiert.
Laryx Decidua

8

Geben Sie vor dem Befehl .import ".mode csv" ein.


5
.mode ist nur für die Ausgabe
DeliriumTremens

9
Anscheinend nicht so. Aus dem Abschnitt .import doc: Beachten Sie, dass es wichtig ist, den "mode" auf "csv" zu setzen, bevor Sie den Befehl ".import" ausführen. Dies ist erforderlich, um zu verhindern, dass die Befehlszeilen-Shell versucht, den Text der Eingabedatei als ein anderes Format zu interpretieren.
Richard - Rogue Wave Limited

8

So importieren Sie eine CSV-Datei in sqlite3

  1. Datenbank erstellen

    sqlite3 NYC.db
  2. Stellen Sie den Modus und den Tabellennamen ein

    .mode csv tripdata
  3. Importieren Sie die CSV-Dateidaten in sqlite3

    .import yellow_tripdata_2017-01.csv tripdata
  4. Tabellen finden

    .tables
  5. Finden Sie Ihr Tabellenschema

    .schema tripdata
  6. Finden Sie Tabellendaten

    select * from tripdata limit 10;
  7. Zählen Sie die Anzahl der Zeilen in der Tabelle

    select count (*) from tripdata;

4

Mit Termsql können Sie dies in einer Zeile tun:

termsql -i mycsvfile.CSV -d ',' -c 'a,b' -t 'foo' -o mynewdatabase.db


Link war defekt, hat ihn in das Github Repo geändert - bitte klarstellen!
Andreas Niedermair

3

Ich hatte genau das gleiche Problem (unter OS X Maverics 10.9.1 mit SQLite3 3.7.13, aber ich glaube nicht, dass SQLite mit der Ursache zusammenhängt). Ich habe versucht, CSV-Daten zu importieren, die aus MS Excel 2011 gespeichert wurden. wird ';'als Spaltentrennzeichen verwendet. Ich fand heraus, dass die CSV-Datei aus Excel immer noch 9-mal Zeilenumbruchzeichen unter Mac OS verwendet. Durch Ändern in Newix-Zeilenumbruch wurde das Problem behoben. AFAIR BBEdit hat hierfür einen Befehl sowie Sublime Text 2.


2
Es ist einfacher zu bedienen tr -s '\r' '\n'und das funktioniert mit allen Arten von zufälligen Dateien.
Donal Fellows

1

Folge den Schritten:-

  1. 1] sqlite3 name 2] .mode csv tablename 3] .import Filename.csv tablename

0

Wie einige Websites und andere Artikel spezifizieren, sehen Sie sich diese einfach an. https://www.sqlitetutorial.net/sqlite-import-csv/

Wir müssen das Trennzeichen für die csvDatei nicht angeben , da csv durch Komma getrennt bedeutet. sqlite> .separator ,Keine Notwendigkeit für diese Linie.

sqlite> create table cities(name, population);
sqlite> .mode csv
sqlite> .import c:/sqlite/city_no_header.csv cities

Das wird einwandfrei funktionieren :)

PS: Meine Städte.csv mit Header.


name,population
Abilene,115930
Akron,217074
Albany,93994
Albuquerque,448607
Alexandria,128283
Allentown,106632
Amarillo,173627
Anaheim,328014

2
Vergiss nicht, .save someFileNameam Ende zu rennen . Ich habe eine Stunde gebraucht, um dies zu finden, um es schließlich in die Speicherdatenbankdatei auf die Festplatte zu exportieren 😅
ioopl
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.