SQLite 导入包含逗号的文本字段的 CSV 文件

8

我想使用编程将csv文件导入SQLite数据库

sqlite> .separator ,
sqlite> .mode csv data
sqlite> .import test.csv data

其中data是一个包含三列的表格名称,就像文件一样。

  • 该文件中有一些用双引号括起来的字符串值。
  • 其中一些字符串值中包含逗号。

例如:data

别名 间谍姓名 机构
007 "邦德,詹姆斯" MI 5
Q "Q先生" MI 5

"邦德,詹姆斯"应被视为单个列,但SQLite会产生错误:

Error: test.csv line 2: expected 3 columns of data but found 4

我该如何让SQLite正确导入这些值?


该字符串是否仅包含逗号“”,还是包含逗号和反斜杠,例如“, \”? - surfmuggle
3个回答

2
SQLite的.import命令可以接受这样的CSV行。
fee, fi,"fo, fum"

假如在引号内的字符串前面的逗号和其之间没有空格,那么可以这样处理。
由于以下内容中在“fi,”和“"fo”之间有一个空格,因此不符合要求。
fee, fi, "fo, fum"

它会产生一个错误,类似于:
expected 3 columns but found 4 - extras ignored

如果有人想知道为什么会这样,这是SQLite的作者Richard Hipp在2019年5月21日发给sqlite-users邮件列表中的两封邮件中对于'CSV导入无法处理由双引号包围的逗号'线程的回复。他写道

这不是有效的CSV。逗号和双引号之间有一个额外的空格字符。

然后发生了什么。

我参考了RFC 4180。https://tools.ietf.org/html/rfc4180。在第2页上写道:“空格被视为字段的一部分,不应被忽略。” 所以逻辑是,如果字符串需要用空白符包围,它也应该包围前导空格。转录见下文。
###################
## incorrect.csv ##
###################   
fee, fi, "fo, fum"

#################    
## correct.csv ##
#################
fee, fi,"fo, fum" 

############################################## 
              ## test.sh ##
##############################################
echo "Importing incorrect.csv into test.db" 
sqlite3 test.db '.mode csv' 'DROP TABLE IF EXISTS incorrect;' 'CREATE TABLE IF NOT EXISTS incorrect(col1 TEXT PRIMARY KEY, col2 TEXT NOT NULL, col3 TEXT NOT NULL);' '.import incorrect.csv incorrect' '.exit'
echo
echo "Importing correct.csv into test.db"
sqlite3 test.db '.mode csv' 'DROP TABLE IF EXISTS correct;' 'CREATE TABLE IF NOT EXISTS correct(col1 TEXT PRIMARY KEY, col2 TEXT NOT NULL, col3 TEXT NOT NULL);' '.import correct.csv correct' '.exit'
echo
echo "Result of 'select * from incorrect'"
sqlite3 test.db 'select * from incorrect' '.exit'
echo
echo "Result of 'select * from correct'"
sqlite3 test.db 'select * from correct' '.exit'  

$ sh test.sh
    
Importing incorrect.csv into test.db
incorrect.csv:1: expected 3 columns but found 4 - extras ignored
    
Importing correct.csv into test.db
    
Result of 'select * from incorrect'
fee| fi| "fo
    
Result of 'select * from correct'
fee| fi|fo, fum

命令 csvtool cat incorrect.csv 格式化文件。链接在这里。然后 .import test.csv data 不会产生错误。 - Prabhjot Singh

2

我知道这个问题有点陈旧,但这是第一个相关的谷歌搜索结果,所以我想分享我的解决方案。

使用不同的分隔符,并删除值周围的引号。

sed -i -e 's/","/|/g' -e 's/"$//g' -e 's/^"//g' file.csv

sqlite> .separator "|"
sqlite> .import file.csv tablename

0

我自己也遇到过这个问题,发现修改脚本以便将SQL查询转储而不是CSV分隔值要容易得多。

导入CSV数据到sqlite3中存在问题,不仅逗号有问题,换行符也有问题。

我建议如下:

  • 修改您的脚本以生成SQL转储
  • 将CSV转储转换为SQL查询并将其提供给sqlite3

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