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"
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