在命令行或批处理文件中将CSV文件导入Sqlite3数据库

时间:2011-08-08 03:36:27

标签: windows csv batch-file import sqlite

我想询问是否还有将包含SQLite3中select语句输出的csv文件导入新数据库? 以下是我到目前为止所做的代码:

sqlite3.exe -csv logsql.sqlite "SELECT local_port AS port, COUNT(local_port) AS hitcount FROM connections  WHERE connection_type = 'accept' GROUP BY local_port ORDER BY hitcount DESC;" > output.csv
sqlite3.exe -csv test.sqlite "CREATE TABLE test (name varchar(255) not null, blah varchar(255) not null);" .import ./output.csv test

正如您所看到的,我的第一个代码是转出所做的查询。

第二行代码我正在尝试创建一个新数据库并尝试将csv文件导入表“test”

感谢您提前提供的任何帮助! :d

6 个答案:

答案 0 :(得分:6)

我建议您从平面文件进行导入,这将创建您的架构,然后进行实际导入:

像这样:

sqlite3.exe test.sqlite < import.sql

import.sql的内容是:

CREATE TABLE test (name varchar(255) not null, blah varchar(255) not null);
.separator ,
.import output.csv test

您可能没有考虑的另一种方法是ATTACH命令。您可以附加新数据库,在其中创建表,然后导入到其表中,这样您就无法执行导出到CSV然后重新分析的额外步骤。它可以来自CREATE TABLE ... AS SELECT ...查询,也可以只是INSERT。

基本上,你可以(从你的PHP页面)运行:

"ATTACH 'c:\directory\to\database\test.db' as TESTDB;"
"CREATE TABLE TESTDB.test AS SELECT local_port AS port, COUNT(local_port) AS hitcount FROM connections  WHERE connection_type = 'accept' GROUP BY local_port ORDER BY hitcount DESC;"

或者:

"ATTACH 'c:\directory\to\database\test.db' as TESTDB;"
"CREATE TABLE TESTDB.test (name varchar(255) not null, blah varchar(255) not null);"
"IMPORT INTO TESTDB.test SELECT local_port AS port, COUNT(local_port) AS hitcount FROM connections  WHERE connection_type = 'accept' GROUP BY local_port ORDER BY hitcount DESC;"

答案 1 :(得分:1)

对于大型CSV文件,使用sqlite3 shell .import命令可能更有效,而不是在Python中解析文件并插入带有sqlite3模块的行。它可以通过os.system(在Linux,Unix或Mac OS X上,或Windows上的Cygwin)完成:

cmd = '(echo .separator ,; echo .import ' + csv_file + ' ' + table + ')'
cmd += '| sqlite3 ' + db_name
os.system(cmd)

答案 2 :(得分:0)

你可以用SQLite命令shell和命令行开关做很多事情...... ...但是我强烈建议你找一个可以在Windows上使用的SQLite感知脚本语言,并且你感觉很舒服。

Perl和Python是两个很好的选择。两者都支持SqlLite,两者都可以免费用于Windows。

两者都可以处理这个问题 - 以及许多其他类型的任务。

答案 3 :(得分:0)

通过bash导入文件的单文件命令对我有用:

sqlite3 inventory.sqlite.db << EOF
delete from audit;
.separator "\t"
.import audit-sorted-uniq.tsv audit
EOF

希望有所帮助。

答案 4 :(得分:0)

首先,您需要使用逗号分隔符和标题行的正确的真实csv文件。 我为此使用了phpstorm的转储工具。

将所有文件放入文件夹。

打开cmd.exe

创建导入语句,其中%〜na是不带扩展名的文件名作为表名

for /R %a in (*.csv) do @echo .import %~na.csv %~na >> import.txt

使用虚拟数据库启动sqlite

sqlite test.sqlite

将导入模式设置为csv

.mode csv

从文件运行命令

.read import.txt

列出所有表格

.tables

退出sqlite

.q

答案 5 :(得分:-1)

我必须导入许多csv文件,因此我编写了以下python脚本,它使用csv的第一行作为表的字段名称来创建和加载csv文件中的sqlite表:

#!/usr/bin/env python
import sqlite3
from csv import DictReader

class SQLiteDB():
    def __init__(self, dbname=':memory:'):
        self.db=sqlite3.connect(dbname)

    def importFromCSV(self, csvfilename, tablename, separator=","):
        with open(csvfilename, 'r') as fh:
            dr = DictReader(fh, delimiter=separator)
            fieldlist=",".join(dr.fieldnames)
            ph=("?,"*len(dr.fieldnames))[:-1]
            self.db.execute("DROP TABLE IF EXISTS %s"%tablename)
            self.db.execute("CREATE TABLE %s(%s)"%(tablename, fieldlist))
            ins="insert into %s (%s) values (%s)"%(tablename, fieldlist, ph)
            for line in dr:
                v=[]
                for k in dr.fieldnames: v.append(line[k])
                self.db.execute(ins, v)
        self.db.commit()

if __name__ == '__main__':
    db=SQLiteDB("mydatabase.sqlite")
    db.importFromCSV("mydata.csv", "mytable")

要导入大量数据,您应该实现交易。

HTH