Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 如何将.sql或.csv文件导入到SQLite中?_Database_Sqlite_Import_Sqlite Shell - Fatal编程技术网

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

Database 如何将.sql或.csv文件导入到SQLite中?,database,sqlite,import,sqlite-shell,Database,Sqlite,Import,Sqlite Shell,我需要将.sql或.csv文件转储到SQLite中(我使用的是SQLite3API)。我只找到了导入/加载表的文档,没有找到整个数据库。现在,当我键入: sqlite3prompt> .import FILENAME TABLE 我得到一个语法错误,因为它需要一个表,而不是一个完整的数据库。请尝试通过以下命令执行此操作: cat dump.sql | sqlite3 database.db 这显然只适用于dump.SQL中的SQL语句。我不确定如何导入CSV。要从SQL文件导入,请使

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

sqlite3prompt> .import FILENAME TABLE 

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

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

cat dump.sql | sqlite3 database.db

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

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

sqlite> .read <filename>
sqlite>。读取
要从CSV文件导入,您需要指定文件类型和目标表:

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

使用SQLite DB从头开始,将CSV导入到表中:

  • 从网站获取SQLite
  • 在命令提示符下运行
    sqlite3
    *它将被创建为一个空文件
  • 在新数据库中创建新表。该表必须与要导入的CSV字段匹配
  • 您可以通过SQL命令执行此操作:
    createtable(,)
一旦创建了表并且列与文件中的数据相匹配,那么就可以执行上述操作

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

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文件的建议,我将对此进行研究

如果您愿意使用(python)脚本,那么有一个python脚本可以在以下位置自动执行此操作:


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

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

查看termsql

它在命令行上将文本转换为SQL。(CSV只是文本)

例如:

cat textfile | termsql -o sqlite.db
默认情况下,分隔符是空白,因此要使其与使用commata的CSV一起工作,您可以这样做:

cat textfile | termsql -d ',' -o sqlite.db
# 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);
或者,您可以执行以下操作:

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
如果要设置自定义列名,请执行以下操作:

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

SQLite非常灵活,因为它还允许SQL语法中特定于SQLite的语法(尽管它们是由CLI解释的)。这意味着您可以这样做

创建一个
sms
表格,如下所示:

cat textfile | termsql -d ',' -o sqlite.db
# 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中一样,如MySQL with
LOAD DATA INFILE
等。但是,不建议这样做

将您的csv或sql导入到sqlite中,这非常好。

如果您在windows中使用它,请确保在“”中添加数据库的路径,并在路径中使用双斜杠\以确保windows理解它。

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

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


如果您想添加更多的列,使用默认的管道字符将它们分开会更容易。

这是正确的答案,但有时它会阻塞时髦/损坏的CSV文件。当我使用.read commond时,它会给出错误“cannot open db.sql”。如果CSV文件中不存在列名,它如何获取列名?@krishna222,根据,如果表不存在,CSV的第一行将用作列名;如果该表确实存在,则所有行都被视为数据。几乎可以工作——标题行导入正常。然而,我得到了
sqlite3.ProgrammingError:您不能使用8位bytestring,除非您使用可以解释8位bytestring的text\u工厂(比如text\u factory=str)。强烈建议您只需将应用程序切换到Unicode字符串
#csv2sqlite.py{csv file path}{sqlite db path}[{table name}]Hmmm,我从未见过使用此选项时出现此错误。您使用的是非unicode还是非utf8数据?如果是这样的话,您可能需要调整脚本以使用它使用的特定编码打开CSV文件!!它甚至可以同时处理多个CSV文件,从文件名中猜出表名。我们需要读取sys.stdin,因为我们需要转换一个60GB的csv.gz文件。或者,是否有机会获得csv2sqlite的gzip读取支持?谢谢@markusN在github跟踪器上打开一个问题。一般来说,我会担心sqlite中的100GB+CSV文件(您是否考虑过“适当的”RDB,例如postgres甚至bigquery、红移etc@jacob仅供参考,这个答案已经有将近4年的历史了,发布它的人已经三年多没来过这里了。你帮我节省了几周时间。我在3秒钟内完成了我的工作。我在5秒钟内将120MB的CSV文件转换为.db。我想这同样有效,但用户必须确保sqlite3设置是为
.mode csv
设置的,只是想在这里发表评论,这实际上是100%死机,
sqlite3 database.db
太慢了!!!所以改用
cat dump.sql | sqlite3 database.db
:D@JavierBuzzi:对不起,那没什么意义。这两种方法是等效的。你一定有当您尝试一种或另一种方法时,会发生其他情况。在稳定的测试条件下,我保证不会有速度差异。blairxy:您得到的错误是由于加载第二行S时“Hey,you!”中的逗号造成的