SQLite 的 .import 将接受这样的 CSV 行
fee, fi,"fo, fum"
前提是前面的逗号和用引号括起来的字符串之间没有空格。IE
fee, fi, "fo, fum"
这会产生类似的错误。
expected 3 columns but found 4 - extras ignored
如果有人想知道为什么会这样,这是 SQLite 的作者 Richard Hipp 在 2019 年 5 月 21 日给 sqlite-users 邮件列表的两封邮件中的回复。他写了:
这不是有效的 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