我有多个大的csv文件,每个文件在很多地方都缺少值。当我将csv文件导入SQLite时,我希望将缺失值记录为NULL,因为另一个应用程序希望缺少的数据由NULL指示。我目前的方法没有产生预期的结果。
示例CSV文件(test.csv)是:
12|gamma|17|delta
67||19|zeta
96|eta||theta
98|iota|29|
第一行完成;其他每一行都有(或意图显示!)一个缺失的项目。当我使用导入时:
.headers on
.mode column
.nullvalue NULL
CREATE TABLE t (
id1 INTEGER PRIMARY KEY,
a1 TEXT,
n1 INTEGER,
a2 TEXT
);
.import test.csv t
SELECT
id1, typeof(id1),
a1, typeof(a1),
n1, typeof(n1),
a2, typeof(a2)
FROM t;
结果是
id1 typeof(id1) a1 typeof(a1) n1 typeof(n1) a2 typeof(a2)
---- ----------- ------ ---------- -- ---------- ------ ----------
12 integer gamma text 17 integer delta text
67 integer text 19 integer zeta text
96 integer eta text text theta text
98 integer iota text 29 integer text
所以缺失的值已成为文本。我将非常感谢如何确保所有缺失值都为NULL。
答案 0 :(得分:4)
sqlite3将值导入为文本,并且似乎没有办法让它将空值视为空值。
但是,您可以在导入后自己更新表,将空字符串设置为空,例如
UPDATE t SET a1=NULL WHERE a1='';
对每一列重复。
您还可以为此类更新创建触发器:
CREATE TRIGGER trig_a1 AFTER INSERT ON t WHEN new.a1='' BEGIN
UPDATE t SET a1=NULL WHERE rowid=new.rowid;
END;
答案 1 :(得分:0)
对于在导入后无法更新的情况,因为在插入空字符串(文本列)或0(整数列)而不是NULL时导入将失败,see my answer to this other stackoverflow question