Impor CSV ke SQLite

117

Saya mencoba mengimpor file csv ke tabel SQLite.

Contoh csv:

1,2
5,6
2,7

Contoh perintah:

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

Saya bahkan tidak yakin mengapa ia menemukan empat kolom dengan enam bagian data dan dua kolom.

Molly Walters
sumber
Tampaknya perintah tersebut mengharapkan header kolom di baris pertama, dan bahwa baris-terminator tidak dikenali seperti itu. 6 - 2 = 4
daging_mekanis
Dapatkah saya menentukan terminator baris atau ada yang hilang dari csv saya?
Molly Walters
1
Sepertinya Anda tidak dapat menentukan terminator baris dari alat baris perintah SQLite. Apakah Anda memiliki editor teks (seperti Notepad di Windows, tetapi lebih baik) yang akan menampilkan karakter penghentian baris? Ada tiga variasi utama: \r\ndi Windows, \ndi * nix (termasuk Mac yang lebih baru), \rdi Mac yang lebih lama.
mechanical_meat
Saya menggunakan BBEdit, tetapi saya tidak melihat karakter-karakter itu di akhir baris. Saya mencoba menambahkannya secara manual, tetapi tampaknya tidak melakukan apa-apa ...
Molly Walters
1
Situs web ini dapat mengonversi file CSV (atau Excel) ke SQLite - converttosqlite.com
Code Slinger

Jawaban:

154

Apa yang juga dikatakan di komentar, SQLite melihat masukan Anda sebagai 1, 25, 62, 7. Saya juga memiliki masalah dengan, dan dalam kasus saya itu diselesaikan dengan mengubah "pemisah," menjadi ".mode csv". Jadi Anda bisa mencoba:

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

Perintah pertama membuat nama kolom untuk tabel. Namun, jika Anda ingin nama kolom diwarisi dari file csv, Anda mungkin mengabaikan baris pertama.

NumesSanguis
sumber
83
Untuk orang lain yang masuk ke sini dari pencarian, jika baris pertama file csv Anda berisi nama kolom, maka Anda dapat menghilangkan create tableperintah pertama dan sqlite akan menggunakan nama kolom dari file csv.
EarlCrapstone
2
@EarlCrapstone: bisakah Anda menjelaskannya? Sepertinya tidak berhasil untuk saya.
d33tah
3
@ d33tah Lihat contoh ini . Perhatikan bagaimana baris pertama berisi nama kolom Year,Make,Model,Description,Pricedan bukan data sebenarnya. Jika demikian halnya dengan file CSV Anda, maka Anda tidak perlu membuat tabel secara manual menggunakan create tableperintah. The .importperintah akan menggunakan baris pertama dalam file Anda untuk menentukan nama kolom dan membuat tabel yang sesuai. Anda masih harus memasukkan nama tabel di perintah. Info yang sama dari dokumen SQLite .
EarlCrapstone
Mengapa Anda mengatur .mode? Bukankah itu hanya untuk keluaran?
Alan
Jika Anda menemukan bahwa tabel yang dihasilkan mengelompokkan beberapa kolom, pastikan Anda tidak menggunakan kata yang dipesan seperti typeuntuk nama kolom CSV.
paulvs
29

Begini cara saya melakukannya.

  • Buat / Konversi file csv untuk dipisahkan oleh tab (\ t) DAN tidak diapit oleh tanda kutip apa pun (sqlite mengartikan kutipan secara harfiah - kata dokumen lama)
  • Masukkan shell sqlite dari db tempat data perlu ditambahkan

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

gyaani_guy
sumber
untuk beberapa baris, tsv saya perlu menentukan pemisah ROW dengan perintah ini .separator "\t" "\r"
mfink
1
Saat membahas format file, tsv! = Csv
Alan
24

Saya menggabungkan info dari jawaban sebelumnya di sini dengan pengalaman saya sendiri. Cara termudah adalah dengan menambahkan header tabel yang dipisahkan koma langsung ke file csv Anda, diikuti dengan baris baru, lalu semua data csv Anda.

Jika Anda tidak pernah melakukan hal-hal sqlite lagi (seperti saya), ini mungkin menghemat satu atau dua pencarian web:

Di shell Sqlite masukkan:

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

Jika Anda belum menginstal Sqlite di Mac Anda, jalankan

$ brew install sqlite3

Anda mungkin perlu melakukan satu pencarian web untuk mengetahui cara menginstal Homebrew.

lukas_o
sumber
1
Bagaimana cara menangani unescaped " characterperingatan?
TMOTTM
Jika Anda membuat tabel sebelum mengimpor, maka tabel tidak akan mencari header.
Rolf
Saya harus meletakkan file di folder yang sama di mana sqlite3.exe berada. Bisakah saya menggunakan jalur lain untuk file csv?
Jaydeep Karena
Poin kecil: "Jika Anda belum menginstal Sqlite di Mac Anda" ... AFAIK sudah diinstal secara default.
Laring Decidua
8

sebelum perintah .import, ketik ".mode csv"

zeo
sumber
5
.mode hanya untuk keluaran
DeliriumTremens
9
Ternyata tidak demikian. Dari bagian doc .import: Perhatikan bahwa penting untuk menyetel "mode" ke "csv" sebelum menjalankan perintah ".import". Ini diperlukan untuk mencegah shell baris perintah mencoba menafsirkan teks file masukan sebagai format lain.
Richard - Rogue Wave Limited
8

Bagaimana cara mengimpor file csv ke sqlite3

  1. Buat database

    sqlite3 NYC.db
  2. Atur mode & nama tab

    .mode csv tripdata
  3. Impor data file csv ke sqlite3

    .import yellow_tripdata_2017-01.csv tripdata
  4. Temukan tabel

    .tables
  5. Temukan skema tabel Anda

    .schema tripdata
  6. Temukan data tabel

    select * from tripdata limit 10;
  7. Hitung jumlah baris dalam tabel

    select count (*) from tripdata;
sivamani
sumber
4

Dengan Termsql Anda dapat melakukannya dalam satu baris:

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

pengguna3573558
sumber
tautan rusak, ubah ke repo github - harap jelaskan!
Andreas Niedermair
3

Saya memiliki masalah yang persis sama (di OS X Maverics 10.9.1 dengan SQLite3 3.7.13, tapi menurut saya SQLite tidak terkait dengan penyebabnya). Saya mencoba mengimpor data csv yang disimpan dari MS Excel 2011, yang btw. digunakan ';'sebagai pemisah kolom. Saya menemukan bahwa file csv dari Excel masih menggunakan karakter baris baru dari Mac OS 9 kali, mengubahnya menjadi unix baris baru memecahkan masalah. AFAIR BBEdit memiliki perintah untuk ini, serta Sublime Text 2.

adass
sumber
2
Ini lebih mudah digunakan tr -s '\r' '\n'dan itu akan berfungsi dengan semua jenis file acak.
Donal Fellows
1

Ikuti langkah-langkahnya: -

  1. 1] nama sqlite3 2] .mode csv nama tab 3] .import Nama berkas.csv nama berkas
Lalit Bangad
sumber
0

Seperti yang ditentukan beberapa situs web dan artikel lain, tampilan sederhananya untuk yang satu ini. https://www.sqlitetutorial.net/sqlite-import-csv/

Kita tidak perlu menentukan separator untuk csvfile, karena csv artinya dipisahkan dengan koma. sqlite> .separator ,tidak perlu baris ini.

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

Ini akan bekerja dengan sempurna :)

PS: Kota saya.csv dengan header.


name,population
Abilene,115930
Akron,217074
Albany,93994
Albuquerque,448607
Alexandria,128283
Allentown,106632
Amarillo,173627
Anaheim,328014
Dupinder Singh
sumber
2
Jangan lupa lari .save someFileNamepada akhirnya. Butuh waktu berjam-jam untuk menemukan ini untuk akhirnya mengekspor ini dalam file basis data memori ke disk 😅
ioopl