【问题标题】:SQLite import csv file with comma in text fieldsSQLite 在文本字段中使用逗号导入 csv 文件
【发布时间】:2014-04-25 23:16:09
【问题描述】:

我想将 csv 文件导入 SQLite db 使用

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 正确导入这些值?

【问题讨论】:

    标签: sqlite csv csv-import


    【解决方案1】:

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

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

    sed -i -e 's/","/|/g' -e 's/"$//g' -e 's/^"//g' file.csv
    
    sqlite> .separator "|"
    sqlite> .import file.csv tablename
    

    【讨论】:

      【解决方案2】:

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

      将 csv 数据导入 sqlite3 时出现问题,不仅使用逗号,而且使用换行符。

      我建议如下:

      • 修改脚本以生成 sql 转储
      • 将 csv 转储转换为 sql 查询并将其提供给 sqlite3

      【讨论】:

        【解决方案3】:

        SQLite 的 .import 将接受这样的 CSV 行

        fee, fi,"fo, fum"
        

        前提是前面的逗号和用引号括起来的字符串之间没有空格。即

        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
        

        【讨论】:

        • 命令csvtool cat incorrect.csv 格式化文件。链接是here。然后.import test.csv data 不会产生错误。
        猜你喜欢
        • 1970-01-01
        • 2013-12-02
        • 1970-01-01
        • 2020-06-23
        • 2014-10-22
        • 1970-01-01
        • 2017-09-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多