2011-05-04 169 views
0

問題:從我的倉庫收到的CSV數據有超過200萬個數字,我需要導入[多欄]表中的[單列]。我需要弄清楚如何將CSV文件導入到MySQL中,但有一些棘手的問題需要克服。經過一番研究,我還沒有找到一個解決辦法...海量CSV到MySQL導入問題

列可以被佈置爲這樣的:(此數據不存在於數據庫中還)

  • ID:自動遞增值
  • serialCode:值從CSV得到
  • somethingID:分配給另一表ID值

    ID | serialCode | somethingID 
    -------------------------------- 
        1 | 1234567 |  42  
        2 | 2345678 |  21 
        3 | 3456789 |  14 
    

在下面的示例格式中有200萬個序列號。每個數字都是一個單獨的serialCode,用逗號分隔,並在一行中包含4個serialCodes。

7121316,8216697,5146909,5191409, 
8125250,6217542,5144896,8198066, 
3125654,9217139,2146880,1192013 

我需要做的就是插入這些串行代碼到MySQL數據庫,具體到只有serialCode列。 ID將自動增加,someID將在以後分配。

回答

3

MySQL的LOAD DATA INFILE命令將會是你的朋友在這裏:http://dev.mysql.com/doc/refman/5.5/en/load-data.html

創建該表第一話,我想下面的命令應該工作:

LOAD DATA INFILE "/path/to/file" INTO TABLE myTable LINES TERMINATED BY "," (serialCode) SET ID=NULL; 
+0

幾個問題的答案。首先,我收到一條錯誤消息:**'字段列表'中的未知列'serialCode'**但該列是真正命名的,包括區分大小寫的字母。其次,我相信您提供的代碼會有問題,因爲字段可能需要以「,」結尾。這是我的代碼:'$ loadsql ='LOAD DATA INFILE「'。$ csvfile。'」INTO TABLE'。$ table。' 「\ n」(serialCode)SET ID = NULL;' – MrFoobar 2011-05-04 18:26:34

+0

btw ...我試過你的代碼,它給出了我上面提到的錯誤信息。 – MrFoobar 2011-05-04 18:30:17

+0

得到它的工作!這裏是正確的代碼'$ loadsql =「LOAD DATA INFILE'」。$ csvfile。「'INTO TABLE」。$ table。「FIELDS TERMINATED BY','LINES TERMINATED BY'\ r \ n'(serialcode)SET id = NULL ;「;' – MrFoobar 2011-05-04 18:40:06

2

您可以使用LOAD DATA INFILE這一點。棘手的部分是,你的行結束符有時是逗號,但有時它是一個逗號和換行符。

最簡單的方法是將值加載到用戶變量中,然後在設置表中的實際列變量時從用戶變量中除去換行符。

像這樣的東西應該爲你工作:

LOAD DATA INFILE '/tmp/your_file.csv' 
INTO TABLE your_table 
LINES TERMINATED BY ',' 
(@serialCode) 
SET id = NULL, 
    serialCode = REPLACE(@serialCode,'\n',''); 
+0

如果文件的窗口行結尾符合「\ r \ n」的建議,那麼只需將此解決方案中的'\ n'修改爲'\ r \ n' – 2011-05-04 18:43:32

+0

James C,您的答案完成了此問題。插入過程現在已成功。注意*如果不添加\ r命令,則代碼將在新的字段行中插入一個0。 – MrFoobar 2011-05-04 18:53:25

0

如果MySQL工具失敗無論出於何種原因(內存限制,編碼問題,無效CSV)你總是在你喜歡的編程語言來編寫一個腳本選項解析並將csv的內容存儲到數據庫中。大多數編程語言都有csv解析能力。