2012-11-27 89 views
12

我試圖讓我的數據文件(其中有一打左右)到SQLite中的表。每個文件都有一個標題,我將在接下來的一年內接收它們幾次,所以我希望:SQLite3導入CSV&排除/跳過標題

  1. 避免編輯每個文件以在我收到標題時刪除標題;
  2. 避免回退shell腳本或Python來做到這一點。

我定義我的表和導入數據...

> .separator "\t" 
> .headers on 
> CREATE TABLE clinical(
     patid  VARCHAR(20), 
     eventdate CHAR(10), 
     sysdate CHAR(10), 
     constype INT, 
     consid  INT, 
     medcode INT, 
     staffid VARCHAR(20), 
     textid  INT, 
     episode INT, 
     enttype INT, 
     adid   INT); 
> .import "Sample_Clinical001.txt" clinical 
> SELECT * FROM clinical LIMIT 10; 
patid eventdate sysdate constype consid medcode staffid textid episode enttype adid 
patid eventdate sysdate constype consid medcode staffid textid episode enttype adid 
471001 30/01/1997 09/03/1997 4 68093 180 0 0 0 20 11484 
471001 30/01/1997 09/03/1997 2 68093 60 0 0 0 4 11485 

我首先想到的是刪除有問題的行,但沒有按預期工作,而不是將其刪除整個表.. 。

> DELETE FROM clinical WHERE patid = "patid"; 
> SELECT * FROM clinical LIMIT 3; 
> 

我是否得到了用於測試相等性的語法錯誤?我不確定; the docs似乎沒有區分這兩者。我想我會再試一次...

> .import "Sample_Clinical001.txt" clinical 
> SELECT * FROM clinical LIMIT 3; 
patid eventdate sysdate constype consid medcode staffid textid episode enttype adid 
patid eventdate sysdate constype consid medcode staffid textid episode enttype adid 
471001 30/01/1997 09/03/1997 4 68093 180 0 0 0 20 11484 
471001 30/01/1997 09/03/1997 2 68093 60 0 0 0 4 11485 
> DELETE FROM clinical WHERE patid == "patid"; 
> SELECT * FROM clinical LIMIT 3; 
> 

我是否在正確的軌道上,或者我在做什麼愚蠢的事情?

如果在文本文件中調用.import作爲標題行是相當常見的情況,那麼我會期望有一個簡單的選項可以跳過標題行。

回答

6

patid是列名。
"patid"是一個引用列名稱。
'patid'是一個字符串。

條件WHERE patid = "patid"patid列中的值與自身進行比較。

(SQLite的允許用雙引號爲了兼容MySQL的字符串,但只有在一個字符串不能用表/列名混淆。)

+0

啊,哈哈!謝謝,我沒有注意到這種微妙的細微差別。 – slackline

+0

可以肯定的是,做正確刪除的條件應該是WHERE patid =「'patid'」,對嗎? – gvrocha

+0

@gvrocha不,'''...'「'沒有意義。 –