SQLite'a bir .sql veya .csv dosyası nasıl içe aktarılır?


115

SQLite'a bir .sql veya .csv dosyası dökmem gerekiyor (SQLite3 API kullanıyorum). Veritabanlarının tamamını değil, yalnızca tabloları içe aktarmak / yüklemek için belgeler buldum. Şu anda yazdığımda:

sqlite3prompt> .import FILENAME TABLE 

Tüm bir DB değil bir tablo beklediği için bir sözdizimi hatası alıyorum.


Yanıtlar:


162

Bir SQL dosyasından içe aktarmak için aşağıdakileri kullanın:

sqlite> .read <filename>

Bir CSV dosyasından içe aktarmak için dosya türünü ve hedef tabloyu belirtmeniz gerekir:

sqlite> .mode csv <table>
sqlite> .import <filename> <table>

2
Bu doğru cevaptır, ancak bazen korkak / bozuk CSV dosyalarını tıkar.
Eli

.Read commond kullandığımda "db.sql açılamıyor" hatası veriyor.
Dory

2
csv dosyasında yoksa sütun adlarını nasıl alır?
sumanth232

@ krishna222, dokümantasyona göre , tablo yoksa, CSV'nin ilk satırı sütun adları olarak kullanılacaktır; tablo mevcutsa, tüm satırlar veri olarak kabul edilir.
alttan

26

Bunu şu komutla yapmayı deneyin:

cat dump.sql | sqlite3 database.db

Bu açıkça sadece dump.sql'deki SQL ifadeleriyle çalışacaktır. Bir CSV'yi nasıl içe aktaracağımdan emin değilim.


Bunun aynı şekilde çalışacağını düşünüyorum, ancak kullanıcının sqlite3 ayarlarının.mode csv
FilBot3

Sadece burada bir yorum yapmak istiyorum, bu aslında% 100 ölü sqlite3 database.db < dump.sql, ÇOK YAVAŞ !!! Onun cat dump.sql | sqlite3 database.dbyerine kullanın! : D
Javier Buzzi

@JavierBuzzi: Üzgünüm ama bu hiç mantıklı değil. Bu iki yöntem eşdeğerdir. Bir yöntemi veya diğerini denediğinizde başka bir şey olmuş olmalısınız. Kararlı test koşulları altında, hız farkı olmayacağını garanti ederim.
IcarusNM

22

SQLite DB ile SCRATCH'tan CSV'yi bir tabloya içe aktarmaya geçmek için:

  • Web sitesinden SQLite edinin.
  • Bir komut isteminde çalıştırın sqlite3 <your_db_file_name>* Boş bir dosya olarak oluşturulacaktır.
  • Yeni veritabanınızda yeni bir tablo oluşturun. Tablo, içe aktarım için CSV alanlarınızla eşleşmelidir.
  • Bunu SQL komutuyla yaparsınız: CREATE TABLE <table_Name> (<field_name1> <Type>, <field_name2> <type>);

Tabloyu oluşturduktan ve sütunlar dosyadaki verilerinizle eşleştikten sonra, yukarıdakileri yapabilirsiniz ...

.mode csv <table_name>
.import <filename> <table_name>

@jacob sadece fyi, bu cevap neredeyse 4 yaşında ve bu cevabı gönderen kişi üç yıldan fazladır burada değil.
Andrew Barber

Haftalarımı kurtardın. İşimi 3 saniyede bitirdim. 120MB CSV dosyasını sadece 5 saniyede .db'ye çevirdim.
zackygaurav

11

Sqlite3 .import komutu sıradan csv verileri için çalışmayacaktır çünkü herhangi bir virgülü tırnak içine alınmış bir dizede bile bir sınırlayıcı olarak ele alır.

Bu, kabuk tarafından oluşturulan bir csv dosyasını yeniden içe aktarmayı içerir:

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

Görünüşe göre csv'yi bir Ekleme deyimleri listesine dönüştürmeliyiz, yoksa belki farklı bir sınırlayıcı çalışacaktır.

SuperUser'da csv dosyalarıyla uğraşmak için LogParser'ı kullanma önerisi gördüm, bununla ilgileneceğim.


blairxy: Aldığınız hata "Hey, Sen!" de virgülden kaynaklanıyor. 2. satırı yüklerken Sqlite 3 sütun görür ve 2. virgül kaldırıldığında hatasız olarak yükleyebilirsiniz.
Shiva

10

Bir (python) komut dosyası kullanmaktan memnunsanız, bunu otomatikleştiren bir python komut dosyası vardır: https://github.com/rgrp/csv2sqlite

Bu, sizin için tabloyu otomatik olarak oluşturacak ve sizin için bazı temel tür tahminlerini ve veri dökümlerini yapacaktır (yani örneğin, bir şeyin bir sayı olduğunu anlayacak ve sütun türünü "gerçek" olarak ayarlayacaktır).


Neredeyse çalışıyor - başlık satırı Tamam'ı içe aktarıyor. Ancak sonra 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-file-path} {sqlite-db-path} [{table-name}]
Marcos,

Hmmm, bunu kullanırken bu hatayı hiç görmedim. Unicode olmayan veya utf8 olmayan veriler mi kullanıyordunuz? Öyleyse, kullandığı belirli kodlamayı kullanarak CSV dosyasını açmak için komut dosyasını ayarlamanız gerekebilir.
Rufus Pollock

Aynı sıralarda, aynı şeyi yapan bir yakut betiği yazdım !! Hatta aynı anda birden fazla CSV dosyası üzerinde çalışmalı ve tablo adını dosya adından tahmin etmelidir. github.com/dergachev/csv2sqlite
Dergachev

60 GB csv.gz dosyasını dönüştürmemiz gerektiğinden sys.stdin'den okumamız gerekir. Veya, gzip okuma desteğini csv2sqlite'a alma şansı olur mu? Teşekkürler!
markusN

@markusN github izleyicide bir sorun açar. Genel olarak, sqlite'da 100GB + CSV dosyası için endişelenirdim ("uygun" bir RDB hakkında düşünceleriniz var mı, örneğin postgres veya hatta bigquery, redshift vb.
Rufus Pollock


1

SQLite son derece esnektir çünkü SQL sözdiziminde SQLite'ye özgü nokta komutlarına da izin verir (CLI tarafından yorumlansalar da). Bu, böyle şeyler yapabileceğiniz anlamına gelir.

Bunun smsgibi bir tablo oluşturun :

# 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);

Ardından iki dosya:

# 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

SQL dosyasını kullanarak CSV dosyasının içe aktarılmasını test etmek için şunu çalıştırın:

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

Sonuç olarak, bu .import, MySQL gibi diğer RDB'lerde olduğu gibi, SQLite SQL'de de ifadeyi kullanabileceğiniz anlamına gelir LOAD DATA INFILE. Ancak, bu önerilmez.


1

Termsql'ye göz atın. https://gitorious.org/termsql https://gitorious.org/termsql/pages/Home

Metni komut satırında SQL'e dönüştürür. (CSV yalnızca metindir)

Misal:

cat textfile | termsql -o sqlite.db

Varsayılan olarak sınırlayıcı beyaz boşluktur, dolayısıyla commata kullanan CSV ile çalışmasını sağlamak için şu şekilde yaparsınız:

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

alternatif olarak bunu yapabilirsiniz:

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

Varsayılan olarak, "COL0", "COL1" sütun adlarını oluşturacaktır, eğer bunu yaptığınız sütun adları için ilk satırı kullanmasını istiyorsanız:

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

Özel sütun adları belirlemek istiyorsanız, şunu yapın:

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

1

Windows'ta kullanıyorsanız, "" içindeki db yolunu eklediğinizden ve ayrıca pencerelerin bunu anladığından emin olmak için yolda çift eğik çizgi \ kullandığınızdan emin olun.


0

Bir kimlik sütununa şu şekilde ekleyebilirsiniz:

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 C: \ kod \ db \ önceden tanımlanmış \ konumundaki bir dosyadır

data.db C: \ code \ db \ dizinindedir

myfile.txt, satırsonu karakteri ile ayrılmış dizeler içerir.

Daha fazla sütun eklemek isterseniz, bunları varsayılan değer olan dikey çubuk karakterini kullanarak ayırmak daha kolaydır.


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.