具有不同列的多个CSV到MySQL

时间:2015-04-03 19:13:56

标签: php mysql csv load-data-infile

我使用"加载数据infile"使用foreach循环在一个表中加载多个.csv文件的语句。这有效,只有我有一个问题。 de .csv中的列不一样。例如,我有这个:

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中的所有其他列?

非常感谢你帮助我!

亲切的问候, 标记

1 个答案:

答案 0 :(得分:0)

我想我明白了这个问题。您不想从CSV的第一行获取列标题,然后构建一个字符串以用作LOAD DATA的col_name_or_user_var参数,并根据需要使用@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);