2015-04-03 56 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