MySQL在文件和fgetcsv中加载数据

时间:2013-07-26 07:33:02

标签: php mysql fgetcsv

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

0 个答案:

没有答案