我尝试导入以分号分隔的文本文件,其中每行以CRLF结尾。第一行包含字段,数据从第2行开始:
"Field1";"Field2"
"123";"Foo"
"456";"Bar"
我尝试了以下内容,但它失败了" input.csv:23:unescaped"字符":
sqlite3.exe
sqlite> .separator ";"
sqlite> .mode csv MyTable
sqlite> .import input.csv MyTable
知道我做错了吗?
谢谢。
答案 0 :(得分:1)
对于sqlite,当要导入的数据可能包含双引号字符(“)时,请不要使用csv模式。读取每个CSV字段csv_read_one_field的代码会查找并在找到时,确保它已终止或期望被引用。
将列分隔符更改为“;”将无济于事,因为该代码仍将执行。
另一方面,以ascii模式ascii_read_one_field读取每个字段的代码仅使用列和行分隔符来确定字段内容。
因此,使用ascii模式并将列和行分隔符设置为分号和行尾,如下所示:
* nix:
sqlite> .mode ascii
sqlite> .separator ";" "\n"
sqlite> .import input.csv MyTable
windows:
sqlite> .mode ascii
sqlite> .separator ";" "\r\n"
sqlite> .import input.csv MyTable
但是,这不会删除数据中的双引号;它们被视为您数据的一部分。
答案 1 :(得分:0)
这对我有用:
$ sqlite3 input.sqlite
sqlite>.mode csv
sqlite>.separator ;
sqlite>.import .input.csv input
创建了以下架构
sqlite> .schema
CREATE TABLE input(
"Field1" TEXT,
"Field2" TEXT
);
在尝试加载更大的CSV文件时,我遇到了类似的问题。在这种情况下,csvsql(csvkit的一部分)起到了作用
csvsql --db sqlite:///mydb.sqlite --insert input.csv
这种方法的另一个好处是可以检测每一列的数据类型。
sqlite> .schema
CREATE TABLE input (
"Field1" DECIMAL NOT NULL,
"Field2" VARCHAR NOT NULL
);