Importa CSV in SQLite


117

Sto cercando di importare un file CSV in una tabella SQLite.

CSV di esempio:

1,2
5,6
2,7

Comando di esempio:

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

Non sono nemmeno sicuro del motivo per cui troverebbe quattro colonne con sei pezzi di dati e due colonne.


Sembra che il comando si aspetti le intestazioni di colonna nella prima riga e che il terminatore di riga non venga riconosciuto come tale. 6 - 2 = 4
Mechanical_meat

Posso specificare un terminatore di riga o ne manca uno nel mio csv?
Molly Walters

1
Non sembra che tu possa specificare il terminatore di riga dallo strumento della riga di comando SQLite. Hai un editor di testo (come Blocco note su Windows, ma migliore) che ti mostrerà i caratteri di terminazione della riga? Esistono tre varianti principali: \r\nsu Windows, \nsu * nix (include i Mac più recenti), \rsu Mac meno recenti .
Mechanical_meat

Sto usando BBEdit, ma non vedo nessuno di quei caratteri alla fine delle righe. Ho provato ad aggiungerli manualmente, ma non sembra fare nulla ...
Molly Walters,

1
Questo sito Web può convertire un file CSV (o Excel) in SQLite - converttosqlite.com
Code Slinger

Risposte:


154

Ciò che viene detto anche nei commenti, SQLite vede il tuo input come 1, 25, 62, 7. Ho anche avuto un problema con, e nel mio caso è stato risolto cambiando "separator" in ".mode csv". Quindi potresti provare:

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

Il primo comando crea i nomi delle colonne per la tabella. Tuttavia, se desideri che i nomi delle colonne vengano ereditati dal file csv, potresti semplicemente ignorare la prima riga.


83
Per altre persone che atterrano qui da una ricerca, se la prima riga del tuo file csv contiene i nomi delle colonne, puoi omettere il primo create tablecomando e sqlite utilizzerà i nomi delle colonne dal file csv.
EarlCrapstone

2
@EarlCrapstone: potresti elaborare? Non sembra funzionare per me.
d33tah

3
@ d33tah Guarda questi esempi . Notare come la prima riga contiene i nomi delle colonne Year,Make,Model,Description,Pricee non i dati effettivi. Se questo è il caso del file CSV, non è necessario creare manualmente la tabella utilizzando il create tablecomando. Il .importcomando utilizzerà la prima riga del file per determinare i nomi delle colonne e creare la tabella di conseguenza. Devi ancora includere il nome della tabella nel comando. Le stesse informazioni dai documenti SQLite .
EarlCrapstone

Perché ti stai ambientando .mode? Non è solo per l'output?
Alan

Se trovi che la tabella generata raggruppa più colonne insieme, controlla di non utilizzare una parola riservata come typeper un nome di colonna CSV.
paulvs

29

Ecco come l'ho fatto.

  • Crea / Converti file csv da separare da tabulazioni (\ t) E non racchiuso da virgolette (sqlite interpreta le virgolette letteralmente - dice vecchi documenti)
  • Inserisci la shell sqlite del db a cui devono essere aggiunti i dati

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


per più righe, il mio tsv doveva specificare il separatore ROW con questo comando .separator "\t" "\r"
mfink

1
Quando si parla di formati di file, tsv! = Csv
Alan

24

Sto unendo le informazioni delle risposte precedenti qui con la mia esperienza. Il modo più semplice è aggiungere le intestazioni di tabella separate da virgole direttamente al tuo file csv, seguite da una nuova riga e poi tutti i tuoi dati csv.

Se non stai mai più facendo cose sqlite (come me), questo potrebbe farti risparmiare una o due ricerche sul web:

Nella shell Sqlite inserisci:

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

Se non hai installato Sqlite sul tuo Mac, esegui

$ brew install sqlite3

Potrebbe essere necessario eseguire una ricerca sul Web per sapere come installare Homebrew.


1
Come gestire gli unescaped " characteravvisi?
TMOTTM

Se crei una tabella prima dell'importazione, non cercherà le intestazioni.
Rolf

Devo mettere il file nella stessa cartella in cui si trova sqlite3.exe. Posso usare un altro percorso per il file CSV?
Jaydeep Karena,

Punto minore: "Se non hai installato Sqlite sul tuo Mac" ... AFAIK è installato di default.
Laryx Decidua

8

prima del comando .import, digita ".mode csv"


5
.mode è solo per l'output
DeliriumTremens

9
A quanto pare non è così. Dalla sezione del documento .import: Notare che è importante impostare "mode" su "csv" prima di eseguire il comando ".import". Ciò è necessario per impedire alla shell della riga di comando di tentare di interpretare il testo del file di input come un altro formato.
Richard - Rogue Wave Limited

8

Come importare il file CSV in sqlite3

  1. Crea database

    sqlite3 NYC.db
  2. Imposta la modalità e il nome della tabella

    .mode csv tripdata
  3. Importa i dati del file csv in sqlite3

    .import yellow_tripdata_2017-01.csv tripdata
  4. Trova tabelle

    .tables
  5. Trova il tuo schema di tabella

    .schema tripdata
  6. Trova i dati della tabella

    select * from tripdata limit 10;
  7. Contare il numero di righe nella tabella

    select count (*) from tripdata;

4

Con Termsql puoi farlo in una riga:

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


il collegamento è stato interrotto, modificato nel repository github - per favore chiarisci!
Andreas Niedermair

3

Ho avuto esattamente lo stesso problema (su OS X Maverics 10.9.1 con SQLite3 3.7.13, ma non credo che SQLite sia correlato alla causa). Ho provato a importare i dati CSV salvati da MS Excel 2011, che a proposito. utilizza ';'come separatore di colonne. Ho scoperto che il file csv da Excel utilizza ancora il carattere di nuova riga da Mac OS 9 volte, cambiandolo in unix newline ha risolto il problema. AFAIR BBEdit ha un comando per questo, oltre a Sublime Text 2.


2
È più facile da usare tr -s '\r' '\n'e funzionerà con tutti i tipi di file casuali.
Donal Fellows

1

Segui i passi:-

  1. 1] nome sqlite3 2] .mode csv tablename 3] .import nomefile.csv tablename

0

Come specificano alcuni siti Web e altri articoli, è semplice dare un'occhiata a questo. https://www.sqlitetutorial.net/sqlite-import-csv/

Non è necessario specificare il separatore per il csvfile, perché csv significa separato da virgole. sqlite> .separator ,non c'è bisogno di questa linea.

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

Funzionerà perfettamente :)

PS: My cities.csv con intestazione.


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

2
Non dimenticare di correre .save someFileNamealla fine. Mi ci sono volute ore per trovarlo per esportarlo finalmente nel file di database della memoria su disco 😅
ioopl
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.