0

我尝试使用 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。

4

0 回答 0