我尝试使用 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;">...
当我使用加载数据文件时,我遇到了列描述原因的问题“;”
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。