インポートするには、.sqlまたは.csvファイルをSQLiteにロードしますか?


115

.sqlまたは.csvファイルをSQLite にダンプする必要があります(SQLite3 APIを使用しています)。データベース全体ではなく、テーブルのインポート/ロードに関するドキュメントのみを見つけました。今、タイプすると:

sqlite3prompt> .import FILENAME TABLE 

DB全体ではなくテーブルを想定しているため、構文エラーが発生します。


回答:


162

SQLファイルからインポートするには、以下を使用します。

sqlite> .read <filename>

CSVファイルからインポートするには、ファイルタイプと宛先テーブルを指定する必要があります。

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

2
これは正しい答えですが、ファンキーな/壊れたCSVファイルで窒息することがあります。
Eli

.read commondを使用すると、「db.sqlを開けません」というエラーが表示されます。
Dory 2014年

2
列名がcsvファイルに存在しない場合、どのように取得しますか?
sumanth232 2015年

@ krishna222、ドキュメントごとにテーブルが存在しない場合、CSVの最初の行が列名として使用されます。テーブルが存在する場合、すべての行がデータとして扱われます。
alttag

26

次のようなコマンドから実行してみてください:

cat dump.sql | sqlite3 database.db

これは明らかに、dump.sql内のSQLステートメントでのみ機能します。CSVをインポートする方法がわかりません。


これは同じように機能すると思いますが、ユーザーはsqlite3設定が次のように設定されていることを確認する必要があります.mode csv
FilBot3

ここでコメントしたいのですが、これは実際には100%死んでいます、sqlite3 database.db < dump.sqlSOOOO SLOW !!! cat dump.sql | sqlite3 database.db代わりに使用してください!:D
Javier Buzzi 2016年

@JavierBuzzi:すみませんが、それは意味がありません。これら2つの方法は同等です。いずれかの方法を試したとき、何か別のことが起こっていたに違いありません。安定したテスト条件下では、速度の違いがないことを保証します。
IcarusNM 2017

22

SQLite DBを使用したSCRATCHからCSVをテーブルにインポートするには:

  • WebサイトからSQLiteを入手してください。
  • コマンドプロンプトで実行sqlite3 <your_db_file_name>*空のファイルとして作成されます。
  • 新しいデータベースに新しいテーブルを作成します。テーブルは、インポートするCSVフィールドと一致する必要があります。
  • これを行うには、SQLコマンドを使用します。 CREATE TABLE <table_Name> (<field_name1> <Type>, <field_name2> <type>);

テーブルを作成し、列がファイルのデータと一致したら、上記を実行できます...

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

@jacobはfyiだけです。この回答はほぼ4歳で、投稿者は3年以上ここにいません。
Andrew Barber

あなたは私の数週間を救った。3秒で仕事が終わりました。120MBのCSVファイルをわずか5秒で.dbに変換しました。
zackygaurav 2016

11

sqlite3 .importコマンドは、引用符で囲まれた文字列でもカンマを区切り文字として扱うため、通常のcsvデータでは機能しません。

これには、シェルによって作成されたcsvファイルの再インポートが含まれます。

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

csvをInsertステートメントのリストに変換する必要があるようです。そうしないと、別の区切り文字が機能する可能性があります。

SuperUserで、LogParserを使用してcsvファイルを処理するように提案されたので、それを調べます。


blairxy:発生しているエラーは、「Hey、You!」のカンマが原因です。2行目をロードしている間、Sqliteは3列を表示し、2番目のカンマを削除すると、エラーなしでロードできます。
Shiva

10

(python)スクリプトを使用してよろしければ、https//github.com/rgrp/csv2sqliteにこれを自動化するpythonスクリプトがあります。

これにより、テーブルが自動的に作成され、基本的な型の推測とデータのキャストが行われます(たとえば、何かが数値であることがわかり、列の型が「実数」に設定されます)。


ほとんど機能します-ヘッダー行はインポートできます。しかし、それから 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

うーん、私はこれを使用してそのエラーを見たことがありません。非Unicodeまたは非utf8データを使用しましたか?その場合、スクリプトを微調整して、使用している特定のエンコードを使用してCSVファイルを開く必要がある場合があります。
Rufus Pollock 2013年

同じ頃、私は同じことをするルビスクリプトを書きました!! ファイル名からテーブル名を推測して、一度に複数のCSVファイルを処理することもできます。github.com/dergachev/csv2sqlite
Dergachev

60GBのcsv.gzファイルを変換する必要があるため、sys.stdinから読み取る必要があります。または、gzip読み取りサポートをcsv2sqliteに取り込むチャンスはありますか?ありがとう!
markusN 2014年

@markusNはgithubトラッカーで問題を開きます。一般的に、私はsqliteの100GB + CSVファイルについて心配します(たとえば、postgresやbigquery、redshiftなどの「適切な」RDBについてはご存知ですか
Rufus Pollock


1

SQLiteは、SQL構文でSQLite固有のドットコマンドも使用できるため、非常に柔軟性があります(ただし、CLIによって解釈されます)。これは、このようなことを実行できることを意味します。

次のsmsようなテーブルを作成します。

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

次に2つのファイル:

# 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ファイルを使用してCSVファイルのインポートをテストするには、次のコマンドを実行します。

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

結論として、これは、.importMySQLのような他のRDBと同じように、SQLite SQLでステートメントを使用できることを意味しますLOAD DATA INFILE。ただし、これは推奨されません。


1

termsqlを確認してください。https://gitorious.org/termsql https://gitorious.org/termsql/pages/Home

コマンドラインでテキストをSQLに変換します。(CSVは単なるテキストです)

例:

cat textfile | termsql -o sqlite.db

デフォルトでは区切り文字は空白なので、カンマを使用しているCSVで機能させるには、次のようにします。

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

あるいは、これを行うことができます:

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

列名の最初の行を使用する場合は、デフォルトで列名「COL0」、「COL1」を生成します。

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

カスタム列名を設定する場合は、次のようにします。

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

1

Windowsで使用している場合は、必ず ""のdbへのパスを追加し、パスでダブルスラッシュ\を使用して、Windowsがそれを理解できるようにします。


0

これは、ID列に挿入する方法です。

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:\ code \ db \ predefined \にあるファイルです

data.dbはC:\ code \ db \にあります

myfile.txtには、改行文字で区切られた文字列が含まれています。

さらに列を追加する場合は、デフォルトのパイプ文字を使用して列を分離する方が簡単です。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.