使用PHP脚本将CSV导入MySQL

使用PHP脚本将CSV导入MySQL,php,mysql,csv,Php,Mysql,Csv,我需要编写一个PHP脚本,该脚本接收包含166列(是的,166)和大约20000行的CSV文件。我没有关于csv文件的决定。最重要的是,它们不是常规的csv文件。由于某些原因,这些文件中的分隔符是“;”而不是冒号。有些字段完全为空,在csv中表示为:value1;;价值3 我已经有了具有匹配列的数据库和表,但有一个额外的id列作为第一列 我所尝试的: LOAD DATA INFILE 'D:/User Directories/Desktop/test.csv' INTO TABLE n

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

我已经有了具有匹配列的数据库和表,但有一个额外的id列作为第一列

我所尝试的:

LOAD DATA INFILE 'D:/User Directories/Desktop/test.csv'
     INTO TABLE nwcatalogue
     FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"'
     LINES TERMINATED BY '\r\n'
//I don't know ho to specify the delimiter for str_getcsv when used as 
//callback

$csv = array_map('str_getcsv', file('data.csv'));
获取一个加载数据(本地)填充查询是可行的,但经过15个小时的不懈尝试,我决定在这里提问。我正在使用的生产服务器是UBUNTU服务器中的一个常规LAMP堆栈,但也有一个本地XAMPP安装,根本不起作用

我还尝试将csv加载到一个数组中,然后在其中循环,但csv从未被正确修剪

即使LOAD DATA INFILE可以工作,我仍然会遇到这样的问题:DB中的1列被设置为自动递增,并且我真的不想在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'
//I don't know ho to specify the delimiter for str_getcsv when used as 
//callback

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

LOAD DATA INFILE 'D:/User Directories/Desktop/test.csv'
     INTO TABLE nwcatalogue
     FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"'
     LINES TERMINATED BY '\r\n'
//I don't know ho to specify the delimiter for str_getcsv when used as 
//callback

$csv = array_map('str_getcsv', file('data.csv'));
加载数据填充有时运行时不会出错,但不会插入任何记录。有时我会遇到权限被拒绝的错误,最常见的是出现“重复密钥”或“超出范围”的错误。该查询既不适用于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
function process_csv($file) {
   $file = fopen($file, "r");
   $data = array();
   while (!feof($file)) {
      $data[] = fgetcsv($file,null,';');
   }
   fclose($file);
   return $data;
}
如果两个分号之间没有值,则只需插入NULL作为值

简而言之,我需要一个数组,其中每个值都有一个特定的键,这样我就可以轻松地逐行循环,或者我需要让这个加载数据填充查询正常工作

我还拥有web服务器和mysql服务器的管理员权限。

试试这个:

<?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);
        ?>

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

,从这里您可以使用匿名函数来处理它,为您的
str_getcsv
指定分隔符,该分隔符作为函数
str_getcsv(string$input[,string$delimiter=“,”的第二个参数…
。对于
NULL
值,您可以尝试在每行插入数据行,并指定实际拥有的列(默认情况下将值设置为NULL),或者在查询中硬编码
NULL
,如果您想找到回复伙伴。我也找到了第一个片段,但我想避免在查询的末尾放置166列^?(如果您使用的是PHPMyAdmin,那么您肯定不能使用它。^^^我会尽快试用。只是我不喜欢在我的代码中看到160个指定的列。我认为这有点不专业。^^^@Frankich将列复制粘贴到查询中时,它会起作用。谢谢^^