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。

+0

看起来你所需要的只是一个带有“GROUP BY”的SUM(GiftAmount)。你使用什么查询? – Kermit

+0

@njk它来自csv而不是mysql数据库。 – Pitchinnate

+0

你可以做两件事之一。在PHP方面,如果它是相同的基金,将会添加设置逻辑。这只会在顺序时才起作用,否则你需要一个数组。在SQL方面,您创建一个临时表,在那里执行计算并插入到生产表中。 – Kermit

我会让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是一个数字列,并且不是将它存储为字符串。

+0

非常感谢您的快速回复。你提到了GiftAmount是数字的假设。在CSV中,它只是一个字符串。我如何将它转换为循环中的十进制(正确?)? –

+0

将'intval($ data [0])'改为'sscanf($ data [0],“\ $%f”)'。 –

+0

以下是我的查询到目前为止的样子: '$ 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似乎是用颜色编码的,好像它在引号内。不过,我不确定这是否是问题。 –