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

use*_*814 5 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|
Run Code Online (Sandbox Code Playgroud)

第一行完成;其他每一行都有(或打算显示!)一个丢失的项目。当我使用导入时:

.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;
Run Code Online (Sandbox Code Playgroud)

结果是

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
Run Code Online (Sandbox Code Playgroud)

所以缺失的值变成了文本。我希望能得到一些关于如何确保所有缺失值都变为 NULL 的指导。

laa*_*lto 5

sqlite3 将值作为文本导入,似乎没有办法将空值视为空值。

但是,您可以在导入后自行更新表,将空字符串设置为空值,例如

UPDATE t SET a1=NULL WHERE a1='';
Run Code Online (Sandbox Code Playgroud)

对每一列重复。

您还可以为此类更新创建触发器:

CREATE TRIGGER trig_a1 AFTER INSERT ON t WHEN new.a1='' BEGIN
  UPDATE t SET a1=NULL WHERE rowid=new.rowid;
END;
Run Code Online (Sandbox Code Playgroud)