2014-03-13 41 views
3

我有多個大的csv文件,每個文件在許多地方都有缺失值。當我將csv文件導入到SQLite中時,我希望將缺少的值記錄爲NULL,因爲另一個應用程序預計缺少的數據將由NULL指示。我目前的方法不會產生所需的結果。從csv導入時,如何獲得記錄爲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的指導。

回答

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; 
+0

好主意,不會在整數字段的工作,雖然在這些中,空字符串被自動轉換爲0。 – fuz