2015-09-07 32 views
2

我有一個很大的.csv文件,我想將其導入到MySQL數據庫中。我想根據其速度使用LOAD DATA INFILE聲明。LOAD DATA INFILE - 以字符結尾的字段也出現在字段

字段終止於-|-。行由|--終止。目前我使用下面的語句:

LOAD DATA LOCAL INFILE 'C:\\test.csv' INTO TABLE mytable FIELDS TERMINATED BY '-|-' LINES TERMINATED BY '|--' 

大多數行看起來像這樣:(注意字符串不被任何字符括起來)

goodstring-|--|-goodstring-|-goodstring-|-goodstring|-- 
goodstring-|--|-goodstring-|-goodstring-|-|-- 
goodstring-|-goodstring-|-goodstring-|-goodstring-|-|-- 

goodstring是不包含字符串作爲角色的-。正如你所看到的,第二列或最後一列可能是空的。像上面這樣的行不會導致任何問題。但最後一列可能包含-個字符。有可能是一排看起來是這樣的:

goodstring-|--|-goodstring-|-goodstring-|---|-- 

在最後一列的字符串--會導致問題。 MySQL檢測六個而不是五個列。它將單個-字符插入第五列並截斷第六列。正確的DB行應該是("goodstring", NULL, "goodstring", "goodstring", "--")

解決辦法是告訴MySQL在第四個字段被終止後作爲第fith列的一部分(直到行終止)。這可能與LOAD DATA INFILE?是否有產生相同結果的方法,不需要編輯源文件並執行的速度可快到LOAD DATA INFILE

+1

「是否可以告訴MySQL將第四個字段之後的所有內容都視爲第五列?」是的,按照[此博客文章](http://ideacode.com/content/mysql-csv-load-fu)上的SET fifthColumn = CONCAT(@ fifthField,@ sixthField)行。 – bishop

+1

我們通常使用'FIELDS TERMINATED BY'¿^?fish╔&®)'' – Drew

+0

謝謝@主教!那篇博文正是我所需要的。 – ByteBullet

回答

1

這是我的解決方案:

LOAD DATA 
LOCAL INFILE 'C:\\test.csv' 
INTO TABLE mytable 
FIELDS TERMINATED BY '-|-' 
LINES TERMINATED BY '-\r\n' 
(col1, col2, col3, col4, @col5, col6) 
SET @col5 = (SELECT CASE WHEN col6 IS NOT NULL THEN CONCAT(@col5, '-') ELSE LEFT(@col5, LENGTH(@col5) - 2) END); 

它會變成一排像這樣的:

goodstring-|--|-goodstring-|-goodstring-|-|-- 

進入這個:

("goodstring", "", "goodstring", "goodstring", NULL) 

而一個壞的一行像這樣的:

goodstring-|--|-goodstring-|-goodstring-|---|-- 

進入這個:

("goodstring", "", "goodstring", "goodstring", "") 

我只是進口下降後的最後一列。