2012-11-04 70 views
1

我正在下載並將遠程文本文件導入到本地mysql數據庫。將逗號分隔文件導入到mysql

格式最近更改爲在其中一列內有逗號,導致導入失敗,並顯示錯誤「第1行的CSV輸入中的字段數無效」。現在的數據如下所示:

"bonita","FL","212025920","2012929","Hooker,Bill" 

如何更新此代碼段以允許在引號內使用逗號?

foreach(explode($lineseparator,$csvcontent) as $line) { 

    $lines++; 

    $line = trim($line," \t"); 

    $line = str_replace("\r","",$line); 

    /************************************ 
    This line escapes the special character. remove it if entries are already escaped in the csv file 
    ************************************/ 
    $line = str_replace("'","\'",$line); 
    /*************************************/ 

    $linearray = explode($fieldseparator,$line); 

    $linemysql = implode("','",$linearray); 

    $linemysql = str_replace("\"","",$linemysql);###code added 

     $query = "insert ignore into $databasetable values('$linemysql');"; 
+1

如果使用在PHP現有fgetcsv()函數(http://www.php.net/manual/en/function .fgetcsv.php)而不是試圖編寫自己的代碼,那麼對你來說生活將變得簡單很多 –

+0

你有一個示例代碼片段嗎?我根本不熟悉fgetcsv。 –

+0

我已鏈接的PHP手冊頁顯示了示例 –

回答

2

重寫你的函數:

 foreach(explode($lineseparator,$csvcontent) as $line) { 

     $lines++; 
     $line = trim($line," \t"); 
     $line = str_replace("\r","",$line); 

     $lineArray = str_getcsv($line, ",", '"'); 
     $linemysql = implode("','",$lineArray); 
     $query = "insert ignore into $databasetable values('$linemysql');"; 
     //.. Handle the rest 

    } 

的PHP getcsv功能需要照顧的分隔符和跟蹤外殼 - 節省您的頭痛。

下面的代碼片斷:

$line = '"bonita","FL","212025920","2012929","Hooker,Bill"'; 
    $array = str_getcsv($line, ",", '"'); 
    print_r($array); 

輸出:

Array ([0] => bonita [1] => FL [2] => 212025920 [3] => 2012929 [4] => Hooker,Bill) 
+0

我用這個替換,但得到500服務器錯誤? foreach(爆炸($ lineseparator,$ csvcontent)爲$ line){ $ lines ++; $ line = trim($ line,「\ t」); $ line = str_replace(「\ r」,「」,$ line); $陣列= str_getcsv($線,」, 「「」 '); \t $ linearray =爆炸($ fieldseparator,$線); \t \t $ linemysql =破滅(「','」,$ linearray); \t \t $ linemysql = str_replace函數( 「\」 「 」「,$ linemysql); ###碼加入 \t \t $ \t查詢=」 插入到忽略$ databasetable值( '$ linemysql') ;「; } –

+0

你不需要行 - $ linearray = explode($ fieldseparator,$ line);再次。刪除。你有str_getcsv行中的lineArray。 – janenz00

+0

在代碼中查看我的編輯 – janenz00

3

LOAD DATA LOCAL INFILEFIELDS TERMINATED BY ',' ENCLOSED BY '"'選項應該直接讀取文件。 LOAD DATA INFILE也比標準INSERT語句更快。

http://dev.mysql.com/doc/refman/5.1/en/load-data.html

這是接近的,但我不認爲TRIM()是去除標籤:

LOAD DATA LOCAL INFILE '/my/local/file/path.csv' IGNORE INTO TABLE mytable FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' (@a, @b, @c, @d, @e) SET col1=TRIM(@a), col2=TRIM(@b), col3=TRIM(@c), col4=TRIM(@d) col5=TRIM(@e)

+0

所以用LOAD數據替換$ query insert?你能提供確切的語法,所以我可以試試嗎? –

0

示例表:

CREATE TABLE `table1` (
    `id` VARCHAR(50) NULL DEFAULT NULL, 
    `a1` VARCHAR(50) NULL DEFAULT NULL, 
    `b1` VARCHAR(50) NULL DEFAULT NULL, 
    `c1` VARCHAR(50) NULL DEFAULT NULL, 
    `d1` VARCHAR(50) NULL DEFAULT NULL 
) 
COLLATE='utf8_general_ci' 
ENGINE=InnoD1B; 

進口查詢:

load data local infile 'd:/import.csv' into table table1 fields terminated by ',' 
enclosed by '"' 
lines terminated by '\r\n' 
(id, a1, b1, c1, d1) 

import.csv

"bonita1","FL1","212025920","2012929","Hooker,Bill" 
"bonita2","FL2","212025920","2012929","Hooker,Bill" 
"bonita3","FL3","212025920","2012929","Hooker,Bill" 
+0

有沒有辦法使用''' 以''''''' 行'在現有插入符中以'\ n'結尾? –

+0

沒有插入符號沒有這些,只是使用加載數據作爲樣本 –