PHP和MySQL:使用列值作为表导入CSV

PHP和MySQL:使用列值作为表导入CSV,php,mysql,database,csv,import,Php,Mysql,Database,Csv,Import,我已将我当前的代码(不太多)放在此页面上供您参考(当然,减去真实密码): 所以我有一个CSV文件,包含5列信息。没有空白值。例如: GiftAmount、GoalAmount、GiftDate、FundID、FundDescription(此行不在CSV中,仅供参考) “10美元”、“500美元”、“2012年1月1日”、“8008”、“8008基金说明” “20美元”、“500美元”、“2012年10月2日”、“8008”、“8008基金说明” “62美元”、“500美元”、“2012年1月

我已将我当前的代码(不太多)放在此页面上供您参考(当然,减去真实密码):

所以我有一个CSV文件,包含5列信息。没有空白值。例如:

GiftAmount、GoalAmount、GiftDate、FundID、FundDescription(此行不在CSV中,仅供参考)

  • “10美元”、“500美元”、“2012年1月1日”、“8008”、“8008基金说明”
  • “20美元”、“500美元”、“2012年10月2日”、“8008”、“8008基金说明”
  • “62美元”、“500美元”、“2012年1月12日”、“8008”、“8008基金说明”
  • “38美元”、“1000美元”、“2012年3月31日”、“9102”、“9102基金说明”
  • “$21”、“$1000”、“4/6/2012”、“9102”、“9102基金说明”
我需要做的是在fundId相同的情况下添加'GiftAmount'列,并将结果放入MySQL数据库。因此,对于上述数据,这里将是结果MySQL表:

  • “$92”|“$500”|“8008”|“8008基金说明”(请注意,不再需要礼品日期)
  • “$59”|“$1000”|“9102”|“9102基金说明”
我正在使用PHP来完成这项工作,PHP文件将每天在Cron作业中运行,因为CSV文件将根据给不同基金的新礼物每天更改


顺便说一句,CSV文件目前有8794行和很多很多FundID。

我会将FundID设置为MYSQL中的唯一键,然后使用查询


这假设GiftAmount是一个数字列,而不是将其存储为字符串。

看起来您需要的只是一个带有
分组依据的
总和(GiftAmount)
。您使用的是什么查询?@njk它来自csv而不是mysql数据库。您可以执行以下两种操作之一。在PHP方面,设置逻辑,如果是相同的基金,将添加该逻辑。这将只在它是连续的情况下工作,否则您将需要一个数组。在SQL端,您创建了一个临时表,在那里执行计算并插入到生产表中。非常感谢您的快速回复。您提到了GiftAmount是数字的假设。在CSV中,它只是一个字符串。如何将其转换为循环中的十进制数(对吗?)?将
intval($data[0])
更改为
sscanf($data[0],“\$%f”)
。以下是我的查询到目前为止的样子:
$db->query(“插入MP(GiftAmount,GoalAmount,GiftDate,FundID,FundDescription)值(“。内爆(“,”,“,$data)。”)在重复密钥更新时,GiftAmount=GiftAmount+“.sscanf($data[0],“\$%f”)。”;”这不会将数据放入数据库。我注意到在我的文本编辑器中,ON-DUPLICATE-KEY更新似乎是用颜色编码的,好像在引号中一样。不过,我不确定这是否是问题所在。这是我的PHPMyAdmin的一个屏幕截图,以防它会有所帮助:好的,我越来越接近:
db->query(“插入MP(GiftAmount、GoalAmount、GiftDate、FundID、FundDescription)值(“”。内爆(“,”,$data)。“)在重复键更新时GiftAmount=GiftAmount+”。floatval(preg\u replace(“/[^-0-9\.]”),$data[0])。“;”不幸的是,计算结果似乎是该组中第一个数字的两倍(在我上面的例子中,8008 FundID组的总数为102,因为它在添加其余的之前先将第一个10美元添加到自身中。你知道为什么会发生这种情况吗?
    $delimiter = ',';
$db = new mysqli('localhost', 'mafgifts_mp', '******', 'mafgifts_mp');

if (($handle = fopen("mpdata.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, $delimiter)) !== FALSE) {
        foreach($data as $i => $content) {
            $data[$i] = $db->real_escape_string($content);
        }
        echo $data[$i]."";
        $db->query("INSERT INTO `MP` 
                      (GiftAmount,GoalAmount,GiftDate,FundID,FundDescription) 
                      VALUES('" . implode("','", $data) . "');");
    }
    fclose($handle);
}

//THE ABOVE CODE PROPERLY PUTS ALL THE DATA INTO THE MySQL DATABASE, BUT I'M NOT 
//ABLE TO DO THE CALCULATIONS I WANT AND INSERT ONLY THE RESULTING DATA.
    $db->query("INSERT INTO `MP` (GiftAmount,GoalAmount,GiftDate,FundID,FundDescription) VALUES('" . implode("','", $data) . "') ON DUPLICATE KEY UPDATE GiftAmount=GiftAmount+".intval($data[0]).";");