SQLiteへのCSVのインポート


117

SQLiteテーブルにcsvファイルをインポートしようとしています。

csvの例:

1,2
5,6
2,7

コマンドの例:

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

6つのデータと2つの列を含む4つの列が見つかる理由はわかりません。


コマンドは最初の行に列ヘッダーが必要であること、および行終了記号がそのように認識されていないようです。6 - 2 = 4
Mechanical_Meat

行末記号を指定できますか、それともcsvから欠落していますか?
モリーウォルターズ

1
SQLiteコマンドラインツールから行末記号を指定できるようには見えません。行末文字を表示するテキストエディター(Windowsのメモ帳など)はありますか?\r\nWindows、\n* nix(新しいMacを含む)、\r古いMacの3つの主なバリエーションがあります。
Mechanical_Meat

BBEditを使用していますが、行末にこれらの文字が表示されません。手動で追加しようとしましたが、何も実行されないようです...
モリーウォルターズ

1
このWebサイトでは、CSV(またはExcel)ファイルをSQLiteに変換できます-converttosqlite.com
Code Slinger

回答:


153

コメントでも述べられているように、SQLiteは入力を1、25、62、7と見なします。私もに問題がありました。私の場合、「セパレーター」を「.mode csv」に変更することで解決しました。だからあなたは試すことができます:

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

最初のコマンドは、テーブルの列名を作成します。ただし、csvファイルから列名を継承したい場合は、最初の行を無視するだけです。


83
検索からここに到達した他の人々の場合、csvファイルの最初の行に列名が含まれている場合、最初のcreate tableコマンドを省略でき、sqliteはcsvファイルの列名を使用します。
EarlCrapstone 2015年

2
@EarlCrapstone:詳しく説明してもらえますか?うまくいかないようです。
d33tah

3
@ d33tahこれらの例を見てください。最初の行にYear,Make,Model,Description,Price実際のデータではなく列名が含まれていることに注意してください。CSVファイルの場合は、create tableコマンドを使用してテーブルを手動で作成する必要はありません。.importコマンドは、列名を決定し、それに応じてテーブルを作成するために、あなたのファイルの最初の行を使用します。それでも、コマンドにテーブルの名前を含める必要があります。SQLiteドキュメントからの同じ情報。
EarlCrapstone 2016年

なぜ設定するの.modeですか?出力専用ではないですか?
アラン

生成されたテーブルで複数の列がグループ化されている場合はtype、CSV列名などに予約語を使用していないことを確認してください。
16年

29

ここに私がそれをした方法があります。

  • タブ(\ t)で区切られ、引用符で囲まれていないcsvファイルを作成/変換する(sqliteは引用符を文字どおりに解釈します-古いドキュメントによると)
  • データを追加する必要があるdbのsqliteシェルに入ります

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


複数行の場合、私のtsvはこのコマンドで行区切り文字を指定する必要がありました .separator "\t" "\r"
mfink

1
ファイル形式について議論するときは、tsv!= csv tools.ietf.org/html/rfc4180を
Alan

24

ここでの以前の回答からの情報を私自身の経験とマージしています。最も簡単な方法は、カンマ区切りのテーブルヘッダーをcsvファイルに直接追加し、その後に新しい行を追加してから、すべてのcsvデータを追加することです。

(私のように)sqliteのようなことを二度と行わない場合は、これにより、Web検索を1、2回節約できます。

Sqliteシェルで次のように入力します。

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

SqliteをMacにインストールしていない場合は、次を実行します。

$ brew install sqlite3

Homebrewのインストール方法については、1回のWeb検索が必要になる場合があります。


1
unescaped " characterアラートを処理するには?
TMOTTM 2017

インポートする前にテーブルを作成すると、ヘッダーは検索されません。
ロルフ

sqlite3.exeがあるのと同じフォルダーにファイルを配置する必要があります。csvファイルに別のパスを使用できますか?
Jaydeep Karena

マイナーポイント:「MacにSqliteがインストールされていない場合」... AFAIKはデフォルトでインストールされます。
Laryx Decidua

8

.importコマンドの前に、「。mode csv」と入力します


5
.modeは出力専用です
DeliriumTremens

9
どうやらそうではない。.import docセクションから:「.import」コマンドを実行する前に、「モード」を「csv」に設定することが重要です。これは、コマンドラインシェルが入力ファイルのテキストを他の形式として解釈しようとするのを防ぐために必要です。
リチャード-Rogue Wave Limited

8

csvファイルをsqlite3にインポートする方法

  1. データベースを作成する

    sqlite3 NYC.db
  2. モードとテーブル名を設定する

    .mode csv tripdata
  3. csvファイルのデータをsqlite3にインポートする

    .import yellow_tripdata_2017-01.csv tripdata
  4. テーブルを探す

    .tables
  5. テーブルスキーマを見つける

    .schema tripdata
  6. テーブルデータを検索する

    select * from tripdata limit 10;
  7. テーブルの行数を数える

    select count (*) from tripdata;

4

ではTermsqlあなたは1行でそれを行うことができます。

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


リンクが壊れていたため、githubリポジトリに変更しました-明確にしてください!
Andreas Niedermair 2015年

3

私はまったく同じ問題を抱えていました(SQLite3 3.7.13がインストールされたOS X Maverics 10.9.1では、SQLiteが原因に関連しているとは思いません)。MS Excel 2011から保存されたcsvデータをインポートしようとしました。';'列セパレータとして使用します。ExcelのcsvファイルがMac OS 9の改行文字をまだ使用していることがわかりました。これをunix改行に変更すると問題が解決しました。AFAIR BBEditにはこのコマンドとSublime Text 2があります。


2
使いやすくtr -s '\r' '\n'、あらゆる種類のランダムファイルで機能します。
ドナルフェロー


0

いくつかのウェブサイトや他の記事が指定しているように、その単純なものはこれに見えます。 https://www.sqlitetutorial.net/sqlite-import-csv/

csvファイルの区切り文字を指定する必要はありません。csvはカンマで区切られているためです。 sqlite> .separator ,この行は必要ありません。

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

これは完璧に動作します:)

PS:ヘッダー付きの私のcity.csv。


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

2
.save someFileName最後に実行することを忘れないでください。😅これは最終的にディスクにメモリデータベースファイルでこれをエクスポートするために見つけるために、私に時間を要した
ioopl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.