2013-02-04 16 views
0

我已經把我當前的代碼(不要太多),這個網頁上,供大家參考(減去真正的密碼,當然):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

回答

1

我會讓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似乎是用顏色編碼的,好像它在引號內。不過,我不確定這是否是問題。 –