2010-09-09 54 views
6

所有插入用換行字符串轉換成數據庫,SQLite的 - 從CSV文件

我試圖注入長文本輸入到一個SQLite數據庫,在文本字段中。該文本中有新的行(即跨越多個段落)。

我可以得到新線露面,如果我手動執行INSERT:

INSERT INTO "LOGENTRY" VALUES(5,40,'PLACE','line1 
line2 

line4 
',1283990533315,'4A','TEXT','',NULL); 

,但如果我有一個CSV文件中的文本等同並嘗試將其.IMPORT到表中,我得到一個錯誤,它期望更多的列不存在(只要遇到新行,程序就認爲它是輸入的結尾,因此它缺少列)。

這可能嗎?或者是手動執行每個INSERT的唯一方法?

回答

4

你的問題是csv格式:SQLite不支持包含值換行。

在源碼方言:

  • 逗號分隔欄

  • 雙引號可用於基團,其包含逗號的字段。

  • 新線劃定記錄

您也需要逃避/刪除您的新的生產線,或者使用一些其他更合適的文件格式。

以下(SED)正規表示將「刪除」不需要換行

s/\(,"[^",]*\)$/\1\1/g 
+0

好點,謝謝你真正閱讀這個問題。我猜CSV不符合我想要做的。 – I82Much 2010-09-09 11:21:16

+1

「官方」的'text/csv'定義(RFC 4180)確實允許在字段內換行。不幸的是,並不是每個實現都支持它而且CSV還有其他一些不適合SQL表的原因,其中一個很大的原因是缺乏區分''''和'NULL'的方法。 – dan04 2010-09-10 22:46:23

+0

之前我曾經低調,但在編輯澄清sqlite的csv支持受到限制後,更改爲upvote。正如@ dan04所說,csv列值可以包含換行符,許多工具都支持這一點。 – 2014-02-14 00:54:35

3

只是簡單的谷歌搜索給我的結果

http://www.mail-archive.com/[email protected]/msg43557.html

是,您可以:

SQLite version 3.6.14.2 
Enter ".help" for instructions 
Enter SQL statements terminated with a ";" 
sqlite> create table x (a); 
sqlite> INSERT INTO x VALUES('line1 
    ...> line2'); 
sqlite> SELECT a FROM x; 
line1 
line2 
sqlite> SELECT hex(a) FROM x; 
6C696E65310A6C696E6532 
sqlite> 

希望它能幫助!

+0

這是否意味着,我必須用'...'替換所有'\ n'? – karim 2011-03-06 11:40:25

0

如果它是在應用程序中,我會用一個參數/準備好的語句,至少對於那些不恆定的值:

db.execSQL("INSERT INTO LOGENTRY " + 
    "VALUES(?, ?, ?, ?, ?, ?, ?, '', NULL)", 
    new Object[]{5, 40, place, text, num, x, t2}); 
+0

謝謝,但它不在應用程序中。 – I82Much 2010-09-09 11:21:53

-1

嘗試「回聲-n」,或使用類似回聲「文件」 | tr'\ n'''

問候。