我有多个,大的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
因此,缺失值已成为文本。我将感谢一些有关如何确保所有缺失值变为零的指导。
sqlite3将值导入文本,似乎没有一种使其作为nulls将空值视为nulls的方法。
但是,您可以在导入后自己更新表,将空字符串设置为nulls,例如
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;
对于您无法在导入之后无法更新的情况其他stackoverflow问题