Wie importiere ich das Laden einer .sql- oder .csv-Datei in SQLite?

115

Ich brauche einen Dump .sql oder .csv - Datei in SQLite (Ich verwende SQLite3 API). Ich habe nur Dokumentation zum Importieren / Laden von Tabellen gefunden, nicht ganze Datenbanken. Im Moment, wenn ich tippe:

sqlite3prompt> .import FILENAME TABLE 

Ich erhalte einen Syntaxfehler, da eine Tabelle und nicht eine gesamte Datenbank erwartet wird.

happythenewsad
quelle
Relevante

Antworten:

162

Verwenden Sie zum Importieren aus einer SQL-Datei Folgendes:

sqlite> .read <filename>

Um aus einer CSV-Datei zu importieren, müssen Sie den Dateityp und die Zieltabelle angeben:

sqlite> .mode csv <table>
sqlite> .import <filename> <table>
Jay Igor
quelle
2
Dies ist die richtige Antwort, aber manchmal verschluckt es sich an funky / kaputten CSV-Dateien.
Eli
Es gibt den Fehler "db.sql kann nicht geöffnet werden", wenn ich .read commond verwende.
Dory
2
Wie erhält man die Spaltennamen, wenn sie nicht in der CSV-Datei vorhanden sind?
Sumanth232
@ krishna222 Wenn die Tabelle laut Dokumentation nicht vorhanden ist, wird die erste Zeile der CSV als Spaltenname verwendet. Wenn die Tabelle vorhanden ist, werden alle Zeilen als Daten behandelt.
Alttag
26

Versuchen Sie es mit dem Befehl wie folgt:

cat dump.sql | sqlite3 database.db

Dies funktioniert natürlich nur mit SQL-Anweisungen in dump.sql. Ich bin nicht sicher, wie ich eine CSV importieren soll.

Kyle Cronin
quelle
Ich denke, das würde genauso funktionieren, aber der Benutzer müsste sicherstellen, dass die sqlite3-Einstellungen für.mode csv
FilBot3
Ich möchte hier nur einen Kommentar sqlite3 database.db < dump.sqlabgeben , das ist tatsächlich 100% tot, ist soooo langsam !!! Also cat dump.sql | sqlite3 database.dbstattdessen verwenden! : D
Javier Buzzi
@ JavierBuzzi: Sorry, aber das macht keinen Sinn. Diese beiden Methoden sind gleichwertig. Sie müssen etwas anderes gehabt haben, als Sie die eine oder andere Methode ausprobiert haben. Unter stabilen Testbedingungen garantiere ich, dass es keinen Geschwindigkeitsunterschied gibt.
IcarusNM
22

So wechseln Sie von SCRATCH mit SQLite DB zum Importieren der CSV in eine Tabelle:

  • Holen Sie sich SQLite von der Website.
  • An einer Eingabeaufforderung ausführen sqlite3 <your_db_file_name>* Es wird als leere Datei erstellt.
  • Erstellen Sie eine neue Tabelle in Ihrer neuen Datenbank. Die Tabelle muss mit Ihren CSV-Feldern für den Import übereinstimmen.
  • Sie tun dies mit dem SQL-Befehl: CREATE TABLE <table_Name> (<field_name1> <Type>, <field_name2> <type>);

Sobald Sie die Tabelle erstellt haben und die Spalten mit Ihren Daten aus der Datei übereinstimmen, können Sie die oben genannten Schritte ausführen ...

.mode csv <table_name>
.import <filename> <table_name>
Jake Wyman
quelle
@jacob nur zu Ihrer Information, diese Antwort ist fast 4 Jahre alt und die Person, die sie gepostet hat, war seit über drei Jahren nicht mehr hier.
Andrew Barber
Du hast meine Wochen gerettet. Ich beendete meine Arbeit in 3 Sekunden. Ich habe 120 MB CSV-Datei in nur 5 Sekunden in .db konvertiert.
Zackygaurav
11

Der Befehl sqlite3 .import funktioniert nicht für normale CSV-Daten, da Kommas auch in Zeichenfolgen in Anführungszeichen als Trennzeichen behandelt werden.

Dies beinhaltet den Versuch, eine von der Shell erstellte CSV-Datei erneut zu importieren:

Create table T (F1 integer, F2 varchar);
Insert into T values (1, 'Hey!');
Insert into T values (2, 'Hey, You!');

.mode csv
.output test.csv
select * from T;

Contents of test.csv:
1,Hey!
2,"Hey, You!"

delete from T;

.import test.csv T
Error: test.csv line 2: expected 2 columns of data but found 3

Es scheint, wir müssen die CSV in eine Liste von Insert-Anweisungen umwandeln, sonst funktioniert möglicherweise ein anderes Trennzeichen.

Drüben bei SuperUser sah ich einen Vorschlag, LogParser für den Umgang mit CSV-Dateien zu verwenden. Ich werde das untersuchen.

blairxy
quelle
blairxy: Der Fehler, den Sie erhalten, ist auf ein Komma in "Hey, You!" zurückzuführen. Beim Laden der 2. Zeile sieht Sqlite 3 Spalten und beim Entfernen des 2. Kommas können Sie es ohne Fehler laden.
Shiva
10

Wenn Sie gerne ein (Python-) Skript verwenden, gibt es ein Python-Skript, das dies automatisiert: https://github.com/rgrp/csv2sqlite

Dadurch wird die Tabelle automatisch für Sie erstellt und es werden einige grundlegende Typschätzungen und Datenumwandlungen für Sie durchgeführt (z. B. wird eine Zahl ermittelt und der Spaltentyp auf "real" gesetzt).

Rufus Pollock
quelle
Funktioniert fast - die Kopfzeile wird OK importiert. Allerdings bekomme ich dann sqlite3.ProgrammingError: You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings# csv2sqlite.py {csv-Dateipfad} {sqlite-db-Pfad} [{Tabellenname}]
Marcos
Hmmm, ich habe diesen Fehler noch nie gesehen. Haben Sie Nicht-Unicode- oder Nicht-Utf8-Daten verwendet? In diesem Fall müssen Sie möglicherweise das Skript optimieren, um die CSV-Datei mit der von ihr verwendeten spezifischen Codierung zu öffnen.
Rufus Pollock
Etwa zur gleichen Zeit habe ich ein Ruby-Skript geschrieben, das das Gleiche tut !! Es sollte sogar mit mehreren CSV-Dateien gleichzeitig funktionieren und den Tabellennamen aus dem Dateinamen erraten. github.com/dergachev/csv2sqlite
Dergachev
Wir müssten aus sys.stdin lesen, da wir eine 60 GB csv.gz-Datei konvertieren müssen. Oder gibt es eine Chance, Unterstützung für gzip-Lesevorgänge in csv2sqlite zu erhalten? Vielen Dank!
MarkusN
@markusN Öffnen Sie ein Problem im Github-Tracker. Im Allgemeinen würde ich mir Sorgen um eine 100 GB + CSV-Datei in SQLite machen (haben Sie allerdings über eine "richtige" RDB nachgedacht, z. B. Postgres oder sogar Bigquery, Rotverschiebung usw.
Rufus Pollock
1

SQLite ist äußerst flexibel, da es auch die SQLite-spezifischen Punktbefehle in der SQL-Syntax zulässt (obwohl sie von der CLI interpretiert werden). Dies bedeutet, dass Sie solche Dinge tun können.

Erstellen Sie eine smsTabelle wie folgt:

# sqlite3 mycool.db '.schema sms'
CREATE TABLE sms (_id integer primary key autoincrement, Address VARCHAR, Display VARCHAR, Class VARCHAR, ServiceCtr VARCHAR, Message VARCHAR, Timestamp TIMESTAMP NOT NULL DEFAULT current_timestamp);

Dann zwei Dateien:

# echo "1,ADREZZ,DizzPlay,CLAZZ,SMSC,DaTestMessage,2015-01-24 21:00:00">test.csv

# cat test.sql
.mode csv
.header on
.import test.csv sms

Führen Sie Folgendes aus, um den Import der CSV-Datei mithilfe der SQL-Datei zu testen:

# sqlite3 -csv -header mycool.db '.read test.sql'

Zusammenfassend bedeutet dies, dass Sie die .importAnweisung in SQLite SQL verwenden können, genau wie in jeder anderen RDB, wie MySQL mit LOAD DATA INFILEusw. Dies wird jedoch nicht empfohlen.

not2qubit
quelle
1

Überprüfen Sie die Begriffeql. https://gitorious.org/termsql https://gitorious.org/termsql/pages/Home

Es konvertiert Text in SQL über die Befehlszeile. (CSV ist nur Text)

Beispiel:

cat textfile | termsql -o sqlite.db

Standardmäßig ist das Trennzeichen ein Leerzeichen. Damit es mit CSV funktioniert, das Kommata verwendet, gehen Sie folgendermaßen vor:

cat textfile | termsql -d ',' -o sqlite.db

Alternativ können Sie dies tun:

termsql -i textfile -d ',' -o sqlite.db

Standardmäßig werden die Spaltennamen "COL0", "COL1" generiert, wenn Sie möchten, dass die erste Zeile für die Spaltennamen verwendet wird, die Sie folgendermaßen ausführen:

termsql -i textfile -d ',' -1 -o sqlite.db

Wenn Sie benutzerdefinierte Spaltennamen festlegen möchten, gehen Sie folgendermaßen vor:

termsql -i textfile -d ',' -c 'id,name,age,color' -o sqlite.db
user3573558
quelle
1

Wenn Sie es in Windows verwenden, müssen Sie den Pfad zur Datenbank in "" hinzufügen und außerdem einen doppelten Schrägstrich \ im Pfad verwenden, um sicherzustellen, dass Windows ihn versteht.

MahD
quelle
0

So können Sie in eine Identitätsspalte einfügen:

CREATE TABLE my_table (id INTEGER PRIMARY KEY AUTOINCREMENT, name COLLATE NOCASE);
CREATE TABLE temp_table (name COLLATE NOCASE);

.import predefined/myfile.txt temp_table 
insert into my_table (name) select name from temp_table;

myfile.txt ist eine Datei in C: \ code \ db \ predefined \

data.db befindet sich in C: \ code \ db \

myfile.txt enthält Zeichenfolgen, die durch Zeilenumbrüche getrennt sind.

Wenn Sie weitere Spalten hinzufügen möchten, ist es einfacher, diese mithilfe des Pipe-Zeichens zu trennen. Dies ist die Standardeinstellung.

Live-Liebe
quelle
-1

Importieren Sie Ihre CSV oder SQL in SQLite mit phpLiteAdmin , es ist ausgezeichnet.

Karra Max
quelle