2016-03-07 20 views
0

我有這個文件,它具有非打印字符(我在UTF-8格式保存它): https://dl.dropboxusercontent.com/u/110553980/mifile.txt如何使用SQLite導入帶有不可打印字符的文件?

然後我想通過這種方式將其加載到SQLite的DB(以下這個提示我」已經找到:Check the encoding of text in SQlite):

PRAGMA encoding = "UTF-8"; 

CREATE TABLE t (
NUMERO_REGISTRO INTEGER 
, RW_FECHA1 TEXT 
, RW_EMISOR1 TEXT 
, RW_IAMAT TEXT 
, RW_GRUPO TEXT 
, RW_NOMIAT TEXT 
, RW_GAASADES1 TEXT 
, RW_PAISDEST1 TEXT 
, RW_MARCA_ALTO_ING TEXT 
, RW_IBTACU_ACT TEXT 
, RW_IBACU_ACT TEXT 
, RW_IIBACU_ACT TEXT 
, RW_IINACU_ACT TEXT 
, RW_IBTACU_ANT TEXT 
, RW_IBACU_ANT TEXT 
, RW_IIBACU_ANT TEXT 
, RW_IINACU_ANT TEXT 
, RW_MARCA_CRECI TEXT 
, RW_MARCA_ACU TEXT 
, RW_DELE_EMI TEXT 
, RW_DISTRITO TEXT 
, RW_DIREMI TEXT 
, RW_POBEMI TEXT 
, RW_PROVINCIA TEXT 
, RW_DELEGACION_ACU TEXT 
, RW_DISTRITO_ACU TEXT 
, RW_ZONA_VENTA_ACU TEXT 
, RW_VENDEDOR_ACU TEXT 
, RW_CONTRATO TEXT 
, RW_NRO_SERIE TEXT 
, RW_OD_ACT TEXT 
, RW_OD_ANT TEXT 
, RW_OD_N1_ACT TEXT 
, RW_OD_N1_ANT TEXT 
, RW_OD_N2_ACT TEXT 
, RW_OD_N2_ANT TEXT 
, RW_JB TEXT 
, RW_CIA TEXT 
, RW_SPAM TEXT 
); 

.separator 'ww' 
.import /home/llami/mifile.txt TABLA 

但它返回當我運行它在我的RedHat Linux服務器如下:

$ sqlite3 dbname.db < /home/llami/loadit.sql 
Error: /home/llami/mifile.txt line 1: expected 39 columns of data but found 10 

我覺得是becouse它無法讀取特殊字符並以某種方式將它們解釋爲記錄的結尾。

我怎樣才能導入這個文件?我不喜歡插入到sql腳本的替代方案,因爲我要加載的實際文件有超過2.000.000條記錄,所以性能是非常重要的一點。

+0

Sqlite3不允許多字節輸入分隔符(至少在最近的版本中);但是代碼似乎並不關心非ascii字符。你正在使用哪個版本? – rici

+0

我使用的是3.6.20版本。如果一個字節分隔符(並修改文件),我有'行1:預期的39列數據,但發現24'。 – harrison4

+0

文本值中不允許空字符。 '.import'不適用於任意的二進制數據。爲什麼使用VARCHAR作爲二進制列? –

回答

1

正在使用的sqlite3版本(根據註釋3.6.20)不允許NUL字節在.import ed數據中,所以每個輸入行都由第一個NUL字節終止。另一方面,它接受多字符分隔符。

更新版本的sqlite3不允許多字符分隔符,但似乎處理NUL字節。但是,TEXT字段可能不適用於包含NUL字節的字符串;我建議使用BLOB s。

順便說一句,在3.6.20,.import作品通過創建一個INSERT INTO 'table' VALUES(...)命令,並與你實際上並沒有使用.import設施保存任何版本執行,所以。自己創建INSERT命令並執行它將會同樣快,而且這樣做的好處是可以讓您根據需要進行準確創建數據。

相關問題