【问题标题】:Loading csv file to MySQL DB with blank "columns" with INSERT使用 INSERT 将 csv 文件加载到带有空白“列”的 MySQL DB
【发布时间】:2011-09-22 16:25:16
【问题描述】:

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

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

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

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

ID [标签] 姓名 [标签] [标签] [标签] 位置 [标签] 传真 [标签] 电话 [结束]
111 [标签] 比利 [标签] [标签] [标签]西雅图 [标签] [标签] 111-111-1111 [结束]
112 [标签] 鲍勃 [标签] [标签] [标签] 亚特兰大 [标签] 111 -111-1112 [标签] 111-111-1114 [结束]

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

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

ID |姓名 |位置 |电话

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

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

【问题讨论】:

标签: php mysql csv insert


【解决方案1】:

使用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】:

    使用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);
    }
    

    【讨论】:

      【解决方案3】:

      fgetcsv() 函数存在忽略空字段的错误。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-15
        • 2023-04-01
        • 2020-06-15
        • 2015-10-07
        • 2015-06-08
        • 2022-11-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多