2013-03-04 80 views
6

我試圖導入字段中有引號的數據集合。他們目前分開標籤。sqlite3導入引號

從我能理解根據文檔(http://www.sqlite.org/cvstrac/wiki?p=ImportingFiles),sqlite shell應該直接解釋引號,我認爲這意味着我應該沒有問題。

我已經運行到這條線上的一個問題:

1193782372 Lips Like Sugar (12" Mix) Echo & the Bunnymen 80's/12": The Extended Collection a76d9b04-51d9-4672-801f-356ab36dbae7 ccd4879c-5e88-4385-b131-bf65296bf245 1abb270a-e791-407f-a989-ff3ad6f8401c 

因爲它是不明確的地方標籤是的,我已經包括了他們在這下面一行。

1193782372\tLips Like Sugar (12" Mix)\tEcho & the Bunnymen\t80's/12": The Extended Collection\ta76d9b04-51d9-4672-801f-356ab36dbae7\tccd4879c-5e88-4385-b131-bf65296bf245\t1abb270a-e791-407f-a989-ff3ad6f8401c 

我正在嘗試執行以下操作,但出現錯誤。

sqlite> .separator \t 
sqlite> .import ./file.txt table 
Error: ./file.txt line n: expected 7 columns of data but found 5 

它沒有雙引號,但引號很重要。我似乎也無法逃過\"的報價。

如何正確導入我想要的數據?

回答

2

您引用的網頁是舊的(請注意URL的cvstrac部分,這是贈品; sqlite現在使用化石,而不是cvs)。該網頁的較新版本是here

由於SQLite是公有領域的軟件,所以你的問題的一個解決方案是修復sqlite的shell.c來正確處理你的文件格式。問題出現在1861行左右,

if(c=='"') inQuote = !inQuote; 

如果你不想引號分隔,只需註釋掉這一行。該行的用途是,您可以通過引用列來在分欄中嵌入分隔符。

另一種方法是使用支持SQLite的數據庫管理器;有很多,並且大多數聲稱支持文件導入/導出。

1

sqlite3命令行工具在支持的導入格式方面不太靈活。

你可以

  • 改變導入文件中的字段添加周圍的雙引號和逃避雙引號;或
  • 導入文件轉換成一系列的SQL語句:

    INSERT INTO MyTable VALUES(
        1193782372, 
        'Lips Like Sugar (12" Mix)', 
        'Echo & the Bunnymen 80''s/12": The Extended Collection', 
        'a76d9b04-51d9-4672-801f-356ab36dbae7', 
        'ccd4879c-5e88-4385-b131-bf65296bf245', 
        '1abb270a-e791-407f-a989-ff3ad6f8401c'); 
    

  • 編寫自己的導入工具。
5

即使.separator不是逗號,Sqlite3的.import工具的行爲就好像其輸入採用逗號分隔值格式。您可以通過加倍引號(「」)來加以引號(「」)引用它們出現的整個字段。

我弄乾了。在運行後通過以下過濾器導入測試數據:

sed 's/"/""/g;s/[^\t]*/"&"/g' file.txt >quoted.txt