从csv导入时,如何将缺失值记录为NULL

时间:2014-03-13 05:43:04

标签: csv sqlite null missing-data

我有多个大的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。

2 个答案:

答案 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