CSV'yi SQLite'a aktarın


117

Bir SQLite tablosuna bir csv dosyası aktarmaya çalışıyorum.

Örnek csv:

1,2
5,6
2,7

Örnek komut:

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

Neden altı parça veri ve iki sütun içeren dört sütun bulduğundan bile emin değilim.


Komutun ilk satırda sütun başlıkları beklediği ve satır sonlandırıcının bu şekilde tanınmadığı görülüyor. 6 - 2 = 4
mechanical_meat

Bir satır sonlandırıcı belirtebilir miyim yoksa csv'mde eksik mi var?
Molly Walters

1
Satır sonlandırıcıyı SQLite komut satırı aracından belirleyebilecek gibi görünmüyor. Size satır sonlandırma karakterlerini gösterecek bir metin düzenleyiciniz (Windows'taki Not Defteri gibi, ancak daha iyisi) var mı? Üç ana varyasyon vardır: \r\nWindows'ta, \n* nix'te (daha yeni Mac'leri içerir) \rve eski Mac'lerde.
mechanical_meat

BBEdit kullanıyorum, ancak satırların sonunda bu karakterlerin hiçbirini görmüyorum. ... Ben elle ekleyerek çalıştı, ancak hiçbir şey görünmüyor
Molly Walters

1
Bu web sitesi bir CSV (veya Excel) dosyasını SQLite'a
Code Slinger

Yanıtlar:


154

Yorumlarda da söylendiği gibi, SQLite girdinizi 1, 25, 62, 7 olarak görüyor. Benim de bir sorunum vardı ve benim durumumda "separator" u ".mode csv" olarak değiştirerek çözüldü. Böylece deneyebilirsin:

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

İlk komut, tablo için sütun adlarını oluşturur. Bununla birlikte, sütun adlarının csv dosyasından miras alınmasını istiyorsanız, ilk satırı göz ardı edebilirsiniz.


83
Aramadan buraya gelen diğer kişiler için, csv dosyanızın ilk satırı sütun adlarını içeriyorsa, ilk create tablekomutu atlayabilirsiniz ve sqlite, csv dosyasındaki sütun adlarını kullanacaktır.
EarlCrapstone

2
@EarlCrapstone: detaylandırır mısınız? Benim için işe yaramıyor gibi görünüyor.
d33tah

3
@ d33tah Bu örneklere bakın . İlk satırın sütun adlarını içerdiğine Year,Make,Model,Description,Priceve gerçek verileri içermediğine dikkat edin . CSV dosyanızdaki durum buysa, create tablekomutu kullanarak tabloyu manuel olarak oluşturmanız gerekmez . .importKomut sütun adlarını belirlemek için dosyasındaki ilk satırını kullanın ve buna göre tablo oluşturur. Yine de tablonun adını komuta eklemeniz gerekir . SQLite belgelerinden aynı bilgiler .
EarlCrapstone

Neden ayarlıyorsunuz .mode? Bu sadece çıktı için değil mi?
Alan

Oluşturulan tablonun birden fazla sütunu gruplandırdığını fark ederseniz, typeCSV sütun adı gibi ayrılmış bir kelime kullanmadığınızdan emin olun .
paulvs

29

İşte böyle yaptım.

  • Csv dosyasını sekmelerle (\ t) ayrılacak VE herhangi bir tırnak içine alınmayacak şekilde oluşturun / dönüştürün (sqlite tırnakları kelimenin tam anlamıyla yorumlar - eski dokümanlar diyor)
  • Verilerin eklenmesi gereken veritabanının sqlite kabuğunu girin

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


birden çok satır için, .separator "\t" "\r"
tsv'm

1
Dosya formatlarını tartışırken, tsv! = Csv Bkz. Tools.ietf.org/html/rfc4180
Alan

24

Buradaki önceki cevaplardan gelen bilgileri kendi deneyimlerimle birleştiriyorum. En kolayı, virgülle ayrılmış tablo başlıklarını doğrudan csv dosyanıza, ardından yeni bir satır ve ardından tüm csv verilerinize eklemektir.

Bir daha asla sqlite şeyler yapmazsanız (benim gibi), bu size bir veya iki web araması kazandırabilir:

Sqlite kabuğunda şunu girin:

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

Mac'inizde Sqlite kurulu değilse,

$ brew install sqlite3

Homebrew'in nasıl kurulacağını öğrenmek için bir web araması yapmanız gerekebilir.


1
unescaped " characterUyarılar nasıl işlenir?
TMOTTM 08

İçe aktarmadan önce bir tablo oluşturursanız, üstbilgileri aramayacaktır.
Rolf

Dosyayı sqlite3.exe'nin bulunduğu klasöre koymam gerekiyor. Csv dosyası için başka bir yol kullanabilir miyim?
Jaydeep Karena

Küçük nokta: "Mac'inizde Sqlite yüklü değilse" ... AFAIK varsayılan olarak yüklenir.
Laryx Desidua

8

.import komutundan önce ".mode csv" yazın


5
.mode yalnızca çıktı içindir
DeliriumTremens

9
Görünüşe göre öyle değil. .İmport belge bölümünden: ".import" komutunu çalıştırmadan önce "modu" "csv" olarak ayarlamanın önemli olduğuna dikkat edin. Bu, komut satırı kabuğunun girdi dosyası metnini başka bir format olarak yorumlamaya çalışmasını önlemek için gereklidir.
Richard - Rogue Wave Limited

8

Csv dosyası sqlite3'e nasıl alınır

  1. Veritabanı yarat

    sqlite3 NYC.db
  2. Modu ve tablo adını ayarlayın

    .mode csv tripdata
  3. Csv dosyası verilerini sqlite3'e aktarın

    .import yellow_tripdata_2017-01.csv tripdata
  4. Tablo bul

    .tables
  5. Tablo şemanızı bulun

    .schema tripdata
  6. Tablo verilerini bulun

    select * from tripdata limit 10;
  7. Tablodaki satırların sayısını sayın

    select count (*) from tripdata;

4

Termsql ile bunu tek satırda yapabilirsiniz:

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


bağlantı koptu, github deposuyla değiştirildi - lütfen açıklayın!
Andreas Niedermair

3

Tamamen aynı problemi yaşadım (OS X Maverics 10.9.1'de SQLite3 3.7.13 ile, ancak SQLite'ın nedenle ilgili olduğunu düşünmüyorum). MS Excel 2011'den kaydedilen csv verilerini btw olarak içe aktarmaya çalıştım. kullanımları ';'sütun ayırıcı olarak. Excel'deki csv dosyasının hala Mac OS'den 9 kez yeni satır karakteri kullandığını öğrendim ve onu unix yeni satır olarak değiştirerek sorunu çözdüm. AFAIR BBEdit'in bunun için Sublime Text 2'nin yanı sıra bir komutu var.


2
Kullanımı daha kolaydır tr -s '\r' '\n've bu, her tür rastgele dosyayla çalışacaktır.
Donal Fellows

1

Adımları takip et:-

  1. 1] sqlite3 adı 2] .mode csv tablename 3] .import Dosyaadı.csv tablename

0

Bazı web sitelerinin ve diğer makalelerin belirttiği gibi, basitliği buna bir bakış atıyor. https://www.sqlitetutorial.net/sqlite-import-csv/

csvDosya için ayırıcı belirtmemize gerek yoktur , çünkü csv virgülle ayrılmış anlamına gelir. sqlite> .separator ,bu çizgiye gerek yok.

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

Bu kusursuz çalışacak :)

Not: Üstbilgiye sahip şehirlerim.csv.


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

2
.save someFileNameSonunda koşmayı unutma . Bunu nihayet bellek veritabanı dosyasında diske aktarmak için bunu bulmam bir saat sürdü 😅
ioopl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.