SQLite: 如何将查询结果保存为CSV文件?

240
有没有办法将查询结果导出到 CSV 文件中?

2
从shell导出,一行代码:https://dev59.com/cW025IYBdhLWcg3w1JeG#21741408 - Anton Tarasenko
7个回答

345

这里和d5e5的评论得知:

您需要将输出切换到csv模式并切换到文件输出。

sqlite> .mode csv
sqlite> .output test.csv
sqlite> select * from tbl1;
sqlite> .output stdout

3
如果您想使用特定路径,请使用sqlite> .output C:/Users/jdoe/Documents/output.csv。 - Dustin
嗨!我做了这个。虽然我的查询运行得很完美,但文件输出为空。有人知道为什么吗? - Valeria Lobos Ossandón
1
@ValeriaLobosOssandón,这种情况刚刚发生在我身上,所以我想回复一下。要么你没有编辑输出文件的权限(不太可能),要么如果你在Excel中查看CSV文件,并且有另一个Excel文件打开,即使你关闭了test.csv文件,Excel仍然会锁定它。在这种情况下,你需要先关闭所有Excel窗口。 - burmer
3
要在输入.mode csv后返回默认模式,请键入.mode list(或退出并重新启动)。 - biscuit314
如何使用头文件实现这个? - onesiumus

189

要将列名包含在您的 CSV 文件中,您可以执行以下操作:

sqlite> .headers on
sqlite> .mode csv
sqlite> .output test.csv
sqlite> select * from tbl1;
sqlite> .output stdout

为了验证您所做的更改,您可以运行此命令:

sqlite> .show

输出:

echo: off   
explain: off   
headers: on   
mode: csv   
nullvalue: ""  
output: stdout  
separator: "|"   
stats: off   
width: 22 18 

6
感谢您展示如何获取列名!这个答案需要更高的评价。 - Stan James
2
请注意,sqlite3会将输出附加到文件末尾而不会擦除先前的内容。 - kupgov
3
但是每次执行 .output filename.csv 命令都会创建或删除该文件。 - kupgov

47

除了上述的答案,您还可以像使用 .output 一样使用 .once。这仅将下一个查询输出到指定文件中,因此您不必跟随 .output stdout

所以在上面的例子中,

.mode csv
.headers on
.once test.csv
select * from tbl1;

27

gdw2和d5e5提供了不错的答案。为了让它更简单,以下是将建议汇总为一系列命令:

sqlite> .mode csv
sqlite> .output test.csv
sqlite> select * from tbl1;
sqlite> .output stdout

21

你也可以在一行中完成它(在Win10中测试过)

sqlite3 -help
sqlite3 -header -csv db.sqlite 'select * from tbl1;' > test.csv

奖励:使用powershell的cmdlet和管道(|)。

get-content query.sql | sqlite3 -header -csv db.sqlite > test.csv

其中 query.sql 是包含您 SQL 查询的文件。


9

现有的答案只适用于sqlite命令行,如果您想构建可重复使用的脚本,这并不理想。Python可以轻松地构建一个可通过程序执行的脚本。

import pandas as pd
import sqlite3

conn = sqlite3.connect('your_cool_database.sqlite')

df = pd.read_sql('SELECT * from orders', conn)
df.to_csv('orders.csv', index = False)

您可以自定义查询以仅将sqlite表的一部分导出到CSV文件中。

您还可以运行单个命令将所有sqlite表导出到CSV文件:

for table in c.execute("SELECT name FROM sqlite_master WHERE type='table';").fetchall():
    t = table[0]
    df = pd.read_sql('SELECT * from ' + t, conn)
    df.to_csv(t + '_one_command.csv', index = False)

更多信息请参见此处


0

虽然.mode csv.output(或.once)命令在SQLite命令行界面(也称为Windows上的sqlite.exe)中可以正常工作。

如果您不使用CLI,仍然可以借助sqlean-fileio扩展来写入输出文件,使用fileio_append(path, string)函数。

例如:

create table people(id integer primary key, name text);

insert into people(id, name) values
(11, 'Alice'), (12, 'Bob'), (13, 'Cindy');

select sum(
    fileio_append('people.csv', format('%d,%s', id, name) || char('10'))
  )
from people;

之后,people.csv 的内容将如下所示:

11,Alice
12,Bob
13,Cindy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接