带引号的sqlite3导入

时间:2013-03-04 22:36:11

标签: sqlite tsv

我正在尝试导入字段中包含引号的数据集合。它们目前以制表符分隔。

根据文档(http://www.sqlite.org/cvstrac/wiki?p=ImportingFiles)我可以理解,sqlite shell应该按字面解释引号,我认为这意味着我不应该有问题。

我在这一行遇到了一个问题:

1193782372  Lips Like Sugar (12" Mix)   Echo & the Bunnymen 80's/12": The Extended Collection   a76d9b04-51d9-4672-801f-356ab36dbae7    ccd4879c-5e88-4385-b131-bf65296bf245    1abb270a-e791-407f-a989-ff3ad6f8401c

由于不清楚标签的位置,我已将它们包含在以下行中。

1193782372\tLips Like Sugar (12" Mix)\tEcho & the Bunnymen\t80's/12": The Extended Collection\ta76d9b04-51d9-4672-801f-356ab36dbae7\tccd4879c-5e88-4385-b131-bf65296bf245\t1abb270a-e791-407f-a989-ff3ad6f8401c

我正在尝试执行以下操作,但收到错误。

sqlite> .separator \t
sqlite> .import ./file.txt table
Error: ./file.txt line n: expected 7 columns of data but found 5

它没有双引号,但引号很重要。我似乎也无法使用\"转义引号。

如何正确导入我想要的数据?

4 个答案:

答案 0 :(得分:7)

Sqlite3的.import工具的行为就像它的输入采用逗号分隔值格式一样,即使.separator不是逗号。您可以通过将引号(“)加倍(”“)引用它们出现的整个字段来转义引号(”)。

在通过以下过滤器运行后,我得到了一个干净的.import测试数据:

sed 's/"/""/g;s/[^\t]*/"&"/g' file.txt >quoted.txt

答案 1 :(得分:2)

您引用的网页是旧的(注意URL的cvstrac部分,这是赠品; sqlite现在使用化石,而不是cvs)。该网页的较新版本为here

由于SQLite是公共领域软件,因此解决您问题的方法之一是修复sqlite的shell.c以正确处理您的文件格式。问题出在第1861行附近

if( c=='"' ) inQuote = !inQuote;

如果您不想引用分隔符,请注释掉此行。该行的目的是通过引用列来嵌入分隔符。

另一种方法是使用支持SQLite的数据库管理器;其中有很多,并且大多数都声称支持文件导入/导出。

答案 2 :(得分:1)

sqlite3命令行工具在支持的导入格式方面不够灵活。

你可以

  • 更改导入文件以在字段中添加双引号并转义双引号;或
  • 将导入文件转换为一系列SQL语句:

    INSERT INTO MyTable VALUES(
        1193782372,
        'Lips Like Sugar (12" Mix)',
        'Echo & the Bunnymen 80''s/12": The Extended Collection',
        'a76d9b04-51d9-4672-801f-356ab36dbae7',
        'ccd4879c-5e88-4385-b131-bf65296bf245',
        '1abb270a-e791-407f-a989-ff3ad6f8401c');
    

  • 编写自己的导入工具。

答案 3 :(得分:0)

要做到这一点而不更改输入数据或sqlite源代码,请使用ascii模式并将列分隔符设置为tab,将行分隔符设置为CRLF(windows)或“ \ n”(* nix)。

windows:

sqlite> .mode ascii
sqlite> .separator "\t" "\r\n"
sqlite> .import ./file.txt table

* nix

sqlite> .mode ascii
sqlite> .separator "\t" "\n"
sqlite> .import ./file.txt table

有关原因,请参见my answer to this question