如何将.sql或.csv文件导入到SQLite中?


115

我需要将.sql.csv文件转储到SQLite中(我正在使用SQLite3 API)。我只找到了用于导入/加载表的文档,而不是整个数据库。现在,当我键入:

sqlite3prompt> .import FILENAME TABLE 

我收到语法错误,因为它期望使用表而不是整个数据库。


Answers:


162

要从SQL文件导入,请使用以下命令:

sqlite> .read <filename>

要从CSV文件导入,您需要指定文件类型和目标表:

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

2
这是正确的答案,但有时它会在时髦/损坏的CSV文件中使您窒息。
伊莱(Eli)2009年

当我使用.read commond时,出现错误“无法打开db.sql”。
多丽2014年

2
如果csv文件中不存在列名,它将如何获取?
sumanth232

@ krishna222,根据文档,如果该表不存在,则CSV的第一行将用作列名;如果该表确实存在,则将所有行都视为数据。
alttag 2016年

26

尝试从以下命令执行此操作:

cat dump.sql | sqlite3 database.db

显然,这仅适用于dump.sql中的SQL语句。我不确定如何导入CSV。


我认为这样做的效果相同,但用户必须确保为.mode csv
FilBot3

只是想在这里发表评论,这实际上是100%sqlite3 database.db < dump.sql无效,是SOOOO SLOW !!!因此请cat dump.sql | sqlite3 database.db改用!:D
哈维尔·巴齐

@JavierBuzzi:对不起,但这没有任何意义。这两种方法是等效的。当您尝试一种方法或另一种方法时,您还必须进行其他操作。在稳定的测试条件下,我保证不会有速度差异。
IcarusNM

22

要从带有SQLite DB的SCRATCH到将CSV导入表中:

  • 从网站获取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岁了,发布它的人已经三年没有来过了。
Andrew Barber 2013年

你救了我的几周。我在3秒钟内完成了工作。我仅用5秒钟就将120MB CSV文件转换为.db。
zackygaurav

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:您收到的错误是由于“嘿,您!”中的逗号引起的。在加载第二行时,Sqlite会看到3列,并且在删除第二个逗号时,可以正确加载它。
希瓦

10

如果您乐于使用(python)脚本,则可以在以下位置使用python脚本来自动执行此操作:https : //github.com/rgrp/csv2sqlite

这将为您自动创建表格,并为您进行一些基本的类型猜测和数据转换(例如,它将得出数字并将列类型设置为“ real”)。


几乎可以正常工作-标题行导入正常。但是然后我得到 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

大约在同一时间,我编写了一个执行相同操作的Ruby脚本!它甚至可以一次处理多个CSV文件,并从文件名中猜测表名。github.com/dergachev/csv2sqlite
Dergachev

我们需要从sys.stdin中读取内容,因为我们需要转换60GB的csv.gz文件。或者,是否有机会将gzip读取支持纳入csv2sqlite?谢谢!
markusN 2014年

@markusN在github跟踪器上打开一个问题。通常,我会担心sqlite中有一个100GB +的CSV文件(尽管您有关于“适当的” RDB的信息,例如postgres甚至bigquery,redshift等
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);

然后是两个文件:

# 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'

总之,这意味着您可以.import在SQLite SQL中使用该语句,就像在任何其他RDB中一样,例如MySQL withetc LOAD DATA INFILE。但是,不建议这样做。


1

查看termsql。https://gitorious.org/termsql https://gitorious.org/termsql/pages/首页

它将命令行上的文本转换为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

这是您可以插入身份列的方法:

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包含用换行符分隔的字符串。

如果要添加更多列,则使用默认的竖线字符更容易将它们分开。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.