使用INSERT将带有空白“列”的csv文件加载到MySQL DB

时间:2011-09-22 16:25:16

标签: php mysql csv insert

我正在尝试编写一个php脚本,它会将制表符分隔的CSV文件加载到MySQL数据库表中,这样我就可以设置一个cron作业来自动执行该过程。

问题:问题是CSV文件包含许多空白“列”,包括空白列标题。

目标:我想要做的是将所有列加载到我的数据库表中除非包含没有列标题的列,即使数据字段为空。作为一个附加条件,有些列我根本不想要,即使它们包含标题。

例如,为了参数,我的csv文件包含以下内容:

  

ID [标签] NAME [标签] [标签] [标签]位置[标签]传真[标签]电话[结束]
   111 [tab] Billy [tab] [tab] [tab] Seattle [tab] [tab] 111-111-1111 [end]
   112 [tab] Bob [tab] [tab] [tab] Atlanta [tab] 111-111-1112 [tab] 111-111-1114 [end]

请注意,在上面的示例中,不仅有些列缺少标题,而且某些数据字段对于标题列是空的。

例如,在我的数据库表中,我有以下列标题:

  

ID | NAME |位置|电话 < - 请注意我根本不需要传真专栏。

我不能使用LOAD DATA INFILE,所以我假设我需要通过php通过INSERT函数完成所有事情。

我知道一些php,但不能做我上面提到的问题。请帮忙。

3 个答案:

答案 0 :(得分:0)

使用PHP函数fgetcsv()

if (($handle = fopen('filename.csv', 'r')) !== FALSE)
{
    while (($data = fgetcsv($handle, 10000, "\t")) !== FALSE)
    {
        print_r($data); // here you get one row -> array with all fields
        // here you can build a SQL insert query    

    }
    fclose($handle);
}

答案 1 :(得分:0)

使用file()str_getcsv()的内容可能有效:

$file = file('csv.csv');
$cols = str_getcsv(array_shift($file), "\t");
foreach ($file as $line) {
    $cells = str_getcsv($line, "\t");
    $set = array();
    for ($i = 0; $i < sizeof($cols); $i++) {
        $set[] = "`{$cols[$i]}` = '{$cells[$i]}'";
    }
    $sql = "INSERT INTO `table` SET " . implode(',', $set);
    mysql_query($sql);
}

答案 2 :(得分:0)

fgetcsv()函数有一个省略空字段的错误。

https://bugs.php.net/bug.php?id=46463