2015-04-03 52 views
0

我使用「load data infile」語句在一個表中使用foreach循環加載多個.csv文件。這工作,只有我有一個問題。 .csv中的列不一樣。例如,我有這樣的:多個CSV到不同列的MySQL

CSV1:

ID,姓名,EAN,說明

CSV2:

ID,名稱,圖像,EAN,說明

而我的MySQL表格是:

ID,姓名,EAN,說明

,是因爲我想通過一個循環導入多個CSV的,我有CSV2一個問題,因爲圖像列。如果可能,我想將csv列的名稱與表列的名稱匹配。所以在這個例子中,[image]沒有被導入。我可以使用@ignore變量,但是因爲每個.csv都不相同,所以這不起作用。我有這個:

$sql = " 
    LOAD DATA LOCAL INFILE '$value[path]' 
     INTO TABLE db1.shoptest 
     FIELDS TERMINATED BY '$value[seperator]' 
     OPTIONALLY ENCLOSED BY '\"' 
     LINES TERMINATED BY '\n' 
    (id, name, ean, description) 
    ;"; 

是否可以將csv列名與表列名匹配並跳過.csv中的所有其他列?

非常感謝您的幫助!

親切的問候, 馬克

+0

予以明確。那些不是唯一的兩種CSV文件格式? – ficuscr 2015-04-03 19:24:32

回答

0

我想我明白這個問題。您不想從CSV的第一行獲取列標題,然後構建一個字符串作爲LOAD DATA的參數,並根據需要使用@ignore變量賦值。

id, name, state, ean, favorite_color, description

成爲...

(id, name, @bunk, ean, @bunk, description)

$whiteList = ['id', 'name', 'ean', 'description']; 
$columnHeader = 'id, name, state, ean, favorite_color, description'; 
$columnHeader = explode(',', $s); 
foreach ($columnHeader as $k => $v) { 
    if (! in_array(trim($v), $whiteList)) $columnHeader[$k] = '@bunk'; 

} 

echo implode(',', $columnHeaders); 
+0

嗨Ficuscr,非常感謝這個答案!這工作!我明天會更好地測試它。你是最好的!! – vistavision 2015-04-03 21:02:39