如何指定在 SQLite 输出中使用的记录分隔符?

问题描述 投票:0回答:4

我使用以下命令将 SQL 查询的结果输出到文本文件:

$sqlite3 my_db.sqlite "SELECT text FROM message;" > out.txt

这给了我这样的输出:

text for entry 1
text for entry 2

不幸的是,当文本包含换行符时,这会失败:

text for entry 1
text for 
entry 2

如何指定 SQLite 在输出数据时使用的输出分隔符(我知道文本中不存在),以便我可以更轻松地解析结果?例如:

text for entry 1
=%=
text for 
entry 2
=%=
text for entry 3
sql sqlite
4个回答
8
投票

尝试使用 -分隔符选项

$sqlite3 -separator '=%=' my_db.sqlite "SELECT text FROM message;" > out.txt

更新1

我想这是因为“-list”默认选项。要关闭此选项,您需要更改当前模式。

这是模式列表

.mode MODE ?TABLE?     Set output mode where MODE is one of:
                            csv      Comma-separated values
                            column   Left-aligned columns.  (See .width)
                            html     HTML <table> code
                            insert   SQL insert statements for TABLE
                            line     One value per line
                            list     Values delimited by .separator string
                            tabs     Tab-separated values
                            tcl      TCL list elements


 -list  Query results will  be  displayed  with  the  separator  (|,  by
        default) character between each field value.  The default.

 -separator separator
        Set output field separator.  Default is '|'.

在这里找到此信息


4
投票

我有同样的问题,有一个更简单的解决方案。我在 https://sqlite.org/cli.html 找到了这个:

.分隔符 COL ?ROW?更改列和行分隔符

例如:

    sqlite> .separator | ,
    sqlite> select * from example_table;

1|3,1|4,1|15,1|21,1|33,2|13,2|16,2|32,

或者没有列分隔符:

    sqlite> .separator '' ,
    sqlite> select * from example_table;

13,14,115,121,133,213,216,232,

或者,要回答上面提出的具体问题,这就是所需要的:

    sqlite> .separator '' \r\n=%=\r\n
    sqlite> select * from message;

text for entry 1
=%=
text for
entry 2
=%=
text for entry 3
=%=

0
投票

您可以在交互式提示中使用

.separator COL [ROW]
特殊命令(如 @dadosalado 在 https://stackoverflow.com/a/60417188/552683 中的回答),或使用
-newline SEP
命令行选项。 (文档


-2
投票

为了分隔列,您必须使用 group_concat 和分隔符。

查询演变:

SELECT text FROM messages;

SELECT GROUP_CONCAT(text, "=%=") FROM messages;

SELECT GROUP_CONCAT(text, "\r\n=%=\r\n") FROM messages;

// to get rid of the concat comma, use replace OR change seperator
SELECT REPLACE(GROUP_CONCAT(text, "\r\n=%="), ',', '\r\n') FROM messages;

SQLFiddle

替代方案:将 Sqlite 导出到 CSV(使用自定义分隔符),然后使用它。

© www.soinside.com 2019 - 2024. All rights reserved.