我尝试使用CSV导入方法。目前我使用fgetcsv
进行每行验证和插入,这有效但速度很慢。所以我想改用加载数据infile
。
CSV由excel导出,;
作为标准分隔符。它来自不同的用户,所以我无法改变这一点。
问题是一列,它可以包含HTML并且还可以使用;在代码中。
当我使用fgetscv
插入时,我没有问题,识别标题。但是对于文件中的加载数据,我肯定会遇到此分隔符的问题。
这样我现在就这样做了:
while (($aCell = fgetcsv($handle, 1000, ";")) !== FALSE) {
$num = count($aCell);
//Run through columns, build array
for ($a = 0; $a < $num; $a++) {
// IDENTIFY HEADERS
switch ($field[$a]) {
case ($field_name = "comlumn1"):
// DO SOME VALIDATION etc.
$array['column1'] = $aCell[$a];
break;
case ($field_name = "comlumn2"):
// DO SOME VALIDATION etc.
$array['column2'] = $aCell[$a];
break;
// AND SO ON
}
}
// INSERT array in db for each row
}
csv结构的一个例子:
column1 column2
1 <p style="margin-top: 10;">...
当我使用加载数据infile时,我会遇到列描述原因“;”
的问题LOAD DATA INFILE '/filepath/import.csv' INTO TABLE import_csv
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n'
我有哪些解决方案?
一个想法是首先通过fgetscv
读出行(就像我上面做的那样)创建一个没有验证且没有插入的临时数组,然后使用其他分隔符进行新的内爆,这样我就可以在加载时使用它数据存档。
我不确定它是否比使用fgetcsv
完成整个事情更快或更有意义,请记住,CSV中的行数不会超过1000行。
修改
我现在的解决方案是,如上所述构建一个数组并使用一个新的唯一分隔符将其内爆:
$fp = fopen("file.csv","w");
foreach((array)$oldarray as $val) {
fwrite($fp,implode("*|*",$val)."\r\n");
}
fclose($fp);
使用这个唯一的分隔符,我可以毫无问题地使用LOAD DATA INFILE。