PHP和MySQL:导入CSV使用列值表
我已经把我当前的代码(不要太多),这个网页上,供大家参考(减去真正的密码,当然):http://mafgiftshop.org/MAF/queue/MP/for-reference.phpPHP和MySQL:导入CSV使用列值表
$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.
所以我有一个包含5列信息的CSV文件。没有空白值。例如:
GiftAmount,GoalAmount,GiftDate,FundID,FundDescription(这行是不是在CSV;它是供参考)
- “$ 10”, “$ 500”,“1/1/2012 “8008”,“8008基金说明”
- “$ 20”,“$ 500”,“2/10/2012”,“8008”,“8008基金说明”
- “$ 62”,“$ 500 “,”2012年1月12日“,”8008“,”8008基金说明“
- ”$ 38“,”$ 1,000“,”3/31/2012“,”9102“,”9102基金说明“
- “$ 21”,“$ 1,000”,“2012年4月6日”,“9102”,“9102基金说明”
我需要做的是添加'GiftAmount'列,而FundIDs是相同的并将结果放入MySQL数据库。因此,对于上面的数据,这里将是由此产生的MySQL表:
- “$ 92”| “$ 500”| “8008”| “8008基金说明”(注意GiftDate不再需要)
- “$ 59”| “$ 1,000”| “9102”| “9102基金说明”
我正在使用PHP来完成此操作,并且PHP文件将每天在Cron作业中运行,因为CSV文件将根据新的礼物每天更改为不同的基金。
顺便说一下,CSV文件目前有8,794行和许多许多FundID。
我会让FundID成为MYSQL中唯一的密钥,然后使用INSERT INTO ... ON DUPLICATE KEY UPDATE查询。
$db->query("INSERT INTO `MP` (GiftAmount,GoalAmount,GiftDate,FundID,FundDescription) VALUES('" . implode("','", $data) . "') ON DUPLICATE KEY UPDATE GiftAmount=GiftAmount+".intval($data[0]).";");
这里假设GiftAmount是一个数字列,并且不是将它存储为字符串。
非常感谢您的快速回复。你提到了GiftAmount是数字的假设。在CSV中,它只是一个字符串。我如何将它转换为循环中的十进制(正确?)? –
将'intval($ data [0])'改为'sscanf($ data [0],“\ $%f”)'。 –
以下是我的查询到目前为止的样子: '$ db-> query(“INSERT INTO MP(GiftAmount,GoalAmount,GiftDate,FundID,FundDescription)VALUES(''。implode('','”,$ data) “')ON DUPLICATE KEY UPDATE GiftAmount = GiftAmount +”。sscanf($ data [0],“\ $%f”)。“;”);' 这不会将数据放入数据库。我注意到在我的文本编辑器中,ON DUPLICATE KEY UPDATE似乎是用颜色编码的,好像它在引号内。不过,我不确定这是否是问题。 –
看起来你所需要的只是一个带有“GROUP BY”的SUM(GiftAmount)。你使用什么查询? – Kermit
@njk它来自csv而不是mysql数据库。 – Pitchinnate
你可以做两件事之一。在PHP方面,如果它是相同的基金,将会添加设置逻辑。这只会在顺序时才起作用,否则你需要一个数组。在SQL方面,您创建一个临时表,在那里执行计算并插入到生产表中。 – Kermit