SQLite导入文本字段中带有逗号的CSV文件

zu0ti5jz  于 2022-11-15  发布在  SQLite
关注(0)|答案(3)|浏览(137)

我想使用以下命令将CSV文件导入到SQLite数据库

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

其中,data是包含三列的表名,就像文件一样。
该文件有一些使用双引号封装的字符串值。某些字符串值中包含逗号("Bond\, James"文件中的实际示例),应将其视为单个列,但SQLite会产生错误

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

如何才能使SQLite正确地导入这些值?

bksxznpy

bksxznpy1#

我知道这有点老了,但这是第一个相关的谷歌搜索结果,所以我想分享我的解决方案。
使用不同的分隔符,并去掉值两边的引号。

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

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

tsm1rwdh2#

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日在'CSV import does not handle fields with a comma surrounded by double'线程中对SQLite用户邮件列表的两封邮件的回应。(应该是“双引号”,但我忘了最后一个词。)他wrote
这不是有效的CSV。逗号之后和双引号之前有一个额外的空格字符。
then
我要坐RFC4180。https://tools.ietf.org/html/rfc4180。在第二页上说:“空格被认为是字段的一部分,不应被忽视。”
(如果有人想知道为什么我发布了第三方/非官方档案的互联网档案副本,IA副本只是出于大量的警告。非官方存档是因为,据我所知,官方邮件列表存档并不存在。邮件列表本身在一段时间前已停止使用。)
因此,逻辑是字符串应该用空格括起来,它也应该用前导空格括起来。
随后是文字记录环节。

###################
## 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
ogsagwnx

ogsagwnx3#

我自己经历过这个问题,我发现修改我的脚本要容易得多,这样它就可以转储SQL查询,而不是CSV分隔值。
将CSV数据导入到SQlite3中时,不仅存在逗号问题,还存在换行符问题。
我会提出以下建议:

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

相关问题