如何将加载 .sql 或 .csv 文件导入 SQLite?

Posted

技术标签:

【中文标题】如何将加载 .sql 或 .csv 文件导入 SQLite?【英文标题】:How to import load a .sql or .csv file into SQLite? 【发布时间】:2010-11-05 23:09:09 【问题描述】:

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

sqlite3prompt> .import FILENAME TABLE 

我收到一个语法错误,因为它需要一个表而不是整个数据库。

【问题讨论】:

Pertinent documentation 【参考方案1】:

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

sqlite> .read <filename>

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

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

【讨论】:

这是正确的答案,但有时它会卡住时髦/损坏的 CSV 文件。 当我使用 .read commond 时出现错误“无法打开 db.sql”。 如果列名不存在于 csv 文件中,如何获取它们? @krishna222,根据the documentation,如果表不存在,则将CSV的第一行用作列名;如果表确实存在,则所有行都被视为数据。【参考方案2】:

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

cat dump.sql | sqlite3 database.db

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

【讨论】:

我认为这同样适用,但用户必须确保为 .mode csv 设置了 sqlite3 设置 只想在这里发表评论,这实际上是 100% 死了,sqlite3 database.db &lt; dump.sql 太慢了!!!所以请改用cat dump.sql | sqlite3 database.db! :D @JavierBuzzi:抱歉,这没有任何意义。这两种方法是等价的。当您尝试一种或另一种方法时,您一定有其他事情发生。在稳定的测试条件下,我保证不会有速度差异。【参考方案3】:

使用 SQLite DB 从 SCRATCH 转到将 CSV 导入表中:

从网站获取 SQLite。 在命令提示符处运行sqlite3 &lt;your_db_file_name&gt; *它将被创建为一个空文件。 在新数据库中创建一个新表。该表格必须与您的 CSV 字段匹配才能导入。 您可以通过 SQL 命令执行此操作:CREATE TABLE &lt;table_Name&gt; (&lt;field_name1&gt; &lt;Type&gt;, &lt;field_name2&gt; &lt;type&gt;);

一旦您创建了表并且列与文件中的数据匹配,那么您可以执行上述操作...

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

【讨论】:

@jacob 仅供参考,这个答案已经有 4 年的历史了,发布它的人已经三年多没有来过这里了。 你救了我几个星期。我在 3 秒内完成了我的工作。我在 5 秒内将 120MB CSV 文件转换为 .db。【参考方案4】:

sqlite3 .import 命令不适用于普通的 csv 数据,因为即使在带引号的字符串中,它也将任何逗号视为分隔符。

这包括尝试重新导入由 shell 创建的 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!”中的逗号引起的。加载第二行时,Sqlite 看到 3 列,删除第二个逗号时,您可以毫无错误地加载它。【参考方案5】:

如果您乐于使用 (python) 脚本,那么有一个 python 脚本可以自动执行此操作:https://github.com/rgrp/csv2sqlite

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

【讨论】:

几乎可以工作——标题行导入正常。但是我得到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] 嗯,我从未见过使用这个错误。您使用的是非 unicode 还是非 utf8 数据?如果是这样,您可能需要调整脚本以使用它使用的特定编码打开 CSV 文件。 大约在同一时间,我写了一个 ruby​​ 脚本来做同样的事情!!它甚至应该同时处理多个 CSV 文件,从文件名中猜测表名。 github.com/dergachev/csv2sqlite 我们需要从 sys.stdin 读取,因为我们需要转换一个 60GB 的 csv.gz 文件。或者,是否有机会在 csv2sqlite 中获得 gzip 读取支持?谢谢! @markusN 在 github 跟踪器上打开一个问题。一般来说,我会担心 sqlite 中的 100GB+ CSV 文件(你有没有想过“正确的”RDB,例如 postgres 甚至 bigquery、redshift 等【参考方案6】:

请记住,SQLite 的默认分隔符是管道“|”

sqlite> .separator ";"

sqlite> .import path/filename.txt tablename 

http://sqlite.awardspace.info/syntax/sqlitepg01.htm#sqlite010

【讨论】:

【参考方案7】:

查看 termsql。 https://gitorious.org/termsqlhttps://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

【讨论】:

【参考方案8】:

SQLite 非常灵活,因为它还允许在 SQL 语法中使用特定于 SQLite 的 dot commands(尽管它们由 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'

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

【讨论】:

【参考方案9】:

如果您在 windows 中使用它,请务必在 "" 中添加 db 的路径,并在路径中使用双斜杠 \ 以确保 windows 能够理解它。

【讨论】:

【参考方案10】:

这是您可以插入标识列的方式:

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

如果您想添加更多列,使用竖线字符更容易将它们分隔,这是默认设置。

【讨论】:

【参考方案11】:

使用phpLiteAdmin 将您的 csv 或 sql 导入 sqlite,非常棒。

【讨论】:

以上是关于如何将加载 .sql 或 .csv 文件导入 SQLite?的主要内容,如果未能解决你的问题,请参考以下文章

BULK INSERT将CSV或TXT文件导入到SQL Server

如何把csv文件导入到sql数据库

将超过 255 个字符从 excel 导入到 sql server(上一个问题 - 如何使用 ssis 将文本限定 CSV 动态加载到 sql server)

我应该如何使用 pgAdmin 3 将数据从 CSV 导入 Postgres 表?

如何将 CSV 数据导入多个数组并通过 VBA 中的函数或子函数返回多个数组?

使用 SQL Workbench 将 csv 文件导入 AWS Redshift 数据库