带引号的sqlite3导入
我正在尝试导入字段中带有引号的数据集合。它们当前是选项卡分隔的 根据docs()的理解,sqlite shell应该逐字解释引号,我认为这意味着我不应该有问题 我在这条线上遇到了一个问题:带引号的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
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');
- 编写自己的导入工具
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