带引号的sqlite3导入

带引号的sqlite3导入,sqlite,tsv,Sqlite,Tsv,我正在尝试导入字段中带有引号的数据集合。它们当前是选项卡分隔的 根据docs()的理解,sqlite shell应该逐字解释引号,我认为这意味着我不应该有问题 我在这条线上遇到了一个问题: 1193782372 Lips Like Sugar (12" Mix) Echo & the Bunnymen 80's/12": The Extended Collection a76d9b04-51d9-4672-801f-356ab36dbae7 ccd4879c-5e88-4

我正在尝试导入字段中带有引号的数据集合。它们当前是选项卡分隔的

根据docs()的理解,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
它不需要双引号,但引号很重要。我似乎也无法用
\“
来避开引号


如何正确导入所需的数据?

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

由于SQLite是公共域软件,解决问题的一个方法是修复SQLite的shell.c以正确处理文件格式

if( c=='"' ) inQuote = !inQuote;
如果不需要引号分隔,只需注释掉这一行。这一行的用途是,通过引用列,可以在列中嵌入分隔符


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

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');
    

  • 编写自己的导入工具

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

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

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

要在不更改输入数据或sqlite源代码的情况下执行此操作,请使用ascii模式,并将列分隔符设置为tab,将行分隔符设置为CRLF(windows)或“\n”(*nix)

窗口:

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


有关原因的解释,请参阅。

此答案已过时;我在
shell.c
上找不到您所指的第1861行。很好的解决方案!我只想指出,mac电脑上的
sed
似乎无法处理制表符(
\t
),因此我通过在
$
前面加上前缀使用了ANSI-C风格的引号,它在mac电脑上也有效:
sed$'s/'/g;s/[^\t]*/'&/g'file.txt>quoted.txt
sqlite> .mode ascii
sqlite> .separator "\t" "\n"
sqlite> .import ./file.txt table