使用PHP脚本将CSV导入MySQL

时间:2019-07-02 12:44:55

标签: php mysql csv

我需要编写一个PHP脚本,该脚本采用166个列(是166个)和大约20.000行的CSV文件。我没有关于csv文件的决定。最重要的是,它们没有常规的csv文件。由于某些原因,这些文件中的分隔符为“;”而不是冒号。某些字段完全为空,在csv中表示为:value1 ;; value3。

我已经有带有匹配列的数据库和表,但是还有一个额外的id列作为第一列。

我尝试过的事情:

让LOAD DATA(LOCAL)INFILE查询正常工作,但是经过15个小时的不懈尝试,我决定在这里询问。我正在使用的生产服务器是UBUNTU服务器中的常规LAMP堆栈,但是安装了本地XAMPP却根本无法工作。

我也尝试过将csv加载到数组中,然后循环遍历,但是csv从未被正确修剪。

即使LOAD DATA INFILE可以工作,我仍然会遇到问题,即数据库中的1列设置为auto_increment,而且我真的不想在sql查询中指定166列标题。

MySQL:

LOAD DATA INFILE 'D:/User Directories/Desktop/test.csv'
     INTO TABLE nwcatalogue
     FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"'
     LINES TERMINATED BY '\r\n'

PHP:

//I don't know ho to specify the delimiter for str_getcsv when used as 
//callback

$csv = array_map('str_getcsv', file('data.csv'));

LOAD DATA INFILE有时会运行而不会出错,但是不会插入任何记录。有时,我会收到一个权限被拒绝的错误,而大多数情况下,我会收到“重复键”或“超出范围”的错误。该查询不适用于Windows或Linux文件系统。

PHP str_getcsv函数的工作原理(稍好一点),但有时值未在正确的位置分开。 e.G我像这样在数组中获取值:

Array =>
[0] => 0;1;;;2;1;2;1
[1] => 0;4;;12;1;0;5
[2] => 5;1;1;;;1;2;;
[3] => 4;1;;;2;1;2;7

如果2个分号之间没有值,则只需插入NULL作为值。

简而言之,我要么需要每个值都有一个特定键的数组,以便可以轻松地逐行循环它,要么需要使此LOAD DATA INFILE查询正常工作。

我还具有Web服务器和mysql服务器的管理员权限。

1 个答案:

答案 0 :(得分:3)

尝试一下:

<?php
        $query = <<<eof
            LOAD DATA INFILE 'D:/User Directories/Desktop/test.csv'
             INTO TABLE nwcatalogue
             FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"'
             LINES TERMINATED BY '\n'
            (fields_go_here)
        eof;

        $db->query($query);
        ?>

对于CSV,请尝试以下操作:

function process_csv($file) {
   $file = fopen($file, "r");
   $data = array();
   while (!feof($file)) {
      $data[] = fgetcsv($file,null,';');
   }
   fclose($file);
   return $data;
}

然后只需调用process_csv('D:/ User Directories / Desktop / test.csv')