2014-10-18 177 views
1

我有兩套csv文件 - 一個包含合同數據,另一個包含授予的合同。我需要使用通用字段(contractName)合併兩個csv文件,並計算已關閉的授予合同總數。 Link to the csv files使用php合併兩個csv文件

到目前爲止,我已經設法將兩個csv文件合併在一起,並將其寫入final.csv文件,但我無法使用公共字段(contractName)合併兩個csv文件。這裏是代碼.`

<?php 
$nn = 0; 
foreach (glob("*.csv") as $filename) { 
    if (($handle = fopen($filename, "r")) !== FALSE) { 
     while (($data = fgetcsv($handle, 0, ",")) !== FALSE) { 

      $c = count($data); 

      for ($x=0;$x<$c;$x++) 
      { 
       $csvarray[$nn][] = $data[$x]; 
      } 
      $nn++; 
     } 

     fclose($handle); 
    } 

} 

$fp = fopen('../final.csv', 'w');//output file set here 

foreach ($csvarray as $fields) { 
    fputcsv($fp, $fields); 
} 

fclose($fp);?> 

這是我的最終輸出。

contractName,contractDate,completionDate,awardee,awardeeLocation,Amount 
Contract-2070-3,5/9/14,8/25/14,"SK Builders",Banke,200000 
Contract-2070-5,3/18/14,4/8/14,"S engineering industries",Makwanpur,300000 
Contract-2070-9,3/6/14,4/6/14,"Gourishankar nirman sewa",Lalitpur,400000 
Contract-2070-10,2/6/14,6/16/14,"SK Builders",Banke,500000 
contractname,status,bidPurchaseDeadline,bidSubmissionDeadline,bidOpeningDate,tenderid,publicationDate,publishedIn 
Contract-2070-1,Closed,6/12/14,6/13/14,6/13/14,2070/071/2,5/14/14,"Nagarik Daily" 
Contract-2070-2,Closed,6/10/14,6/11/14,6/11/14,16/070/71,5/12/14,"The Himalayan Times" 
Contract-2070-3,Current,3/8/14,3/9/14,3/9/14,DDC/Bag/Bridge/03-070/71,3/10/14,"Nagarik Daily" 
Contract-2070-4,Current,4/23/14,4/25/14,4/25/14,04(2070/071),4/9/14,"Hetauda sandesh" 
Contract-2070-5,Closed,4/23/14,4/25/14,4/26/14,04(2070/071),4/10/14,"Hetauda sandesh" 
Contract-2070-6,Current,4/23/14,4/25/14,4/27/14,04(2070/071),4/11/14,"Hetauda sandesh" 
Contract-2070-7,Current,4/23/14,4/25/14,4/28/14,04(2070/071),4/12/14,"Hetauda sandesh" 
Contract-2070-8,Current,4/23/14,4/25/14,4/29/14,04(2070/071),4/13/14,"Hetauda sandesh" 
Contract-2070-9,Closed,2/6/14,2/8/14,2/8/14,15/070/71,1/9/14,"The Himalayan Times" 
Contract-2070-10,Current,1/14/14,1/15/14,1/16/14,"13,2070/2071",1/6/14,"The Himalayan Times" 

但最終的輸出應該是這樣的。

contractname,status,bidPurchaseDeadline,bidSubmissionDeadline,bidOpeningDate,tenderid,publicationDate,publishedIn,contractDate,completionDate,awardee,awardeeLocation,Amount 
Contract-2070-1,Closed,6/12/14,6/13/14,6/13/14,2070/071/2,5/14/14,Nagarik Daily,,,,, 
Contract-2070-2,Closed,6/10/14,6/11/14,6/11/14,16/070/71,5/12/14,The Himalayan Times,,,,, 
Contract-2070-3,Current,3/8/14,3/9/14,3/9/14,DDC/Bag/Bridge/03-070/71,3/10/14,Nagarik Daily,5/9/14,8/25/14,SK Builders,Banke,200000 
Contract-2070-4,Current,4/23/14,4/25/14,4/25/14,04(2070/071),4/9/14,Hetauda sandesh,,,,, 
Contract-2070-5,Closed,4/23/14,4/25/14,4/26/14,04(2070/071),4/10/14,Hetauda sandesh,3/18/14,4/8/14,S engineering industries,Makwanpur,300000 
Contract-2070-6,Current,4/23/14,4/25/14,4/27/14,04(2070/071),4/11/14,Hetauda sandesh,,,,, 
Contract-2070-7,Current,4/23/14,4/25/14,4/28/14,04(2070/071),4/12/14,Hetauda sandesh,,,,, 
Contract-2070-8,Current,4/23/14,4/25/14,4/29/14,04(2070/071),4/13/14,Hetauda sandesh,,,,, 
Contract-2070-9,Closed,2/6/14,2/8/14,2/8/14,15/070/71,1/9/14,The Himalayan Times,3/6/14,4/6/14,Gourishankar nirman sewa,Lalitpur,400000 
Contract-2070-10,Current,1/14/14,1/15/14,1/16/14,"13, 2070/2071",1/6/14,The Himalayan Times,2/6/14,6/16/14,SK Builders,Banke,500000 
+0

如果一個命令行實用程序將適合你,你可以嘗試http://csvkit.readthedocs.org/en/latest/scripts/csvjoin.html – Giovanni 2014-10-18 14:44:44

+0

@Giovanni對不起,我被告知不要使用命令行。我需要通過php來完成。有什麼辦法嗎?我現在被卡住了。 – Raaz 2014-10-18 14:50:07

+0

@Giovanni我試過csvkit,它也很方便,但可惜我不能使用它 – Raaz 2014-10-18 15:31:35

回答

1

這個問題心不是那麼難,你總是可以把數據的CSV對數組的和與他們合作,這樣的解決方案:

// 1st section 
     $fh = fopen('awards.csv', 'r'); 
     $fhg = fopen('contracts.csv', 'r'); 
     while (($data = fgetcsv($fh, 0, ",")) !== FALSE) { 
      $awards[]=$data; 
     } 
     while (($data = fgetcsv($fhg, 0, ",")) !== FALSE) { 
       $contracts[]=$data; 
     } 
// 2nd section 
     for($x=0;$x< count($contracts);$x++) 
     { 
      if($x==0){ 
       unset($awards[0][0]); 
       $line[$x]=array_merge($contracts[0],$awards[0]); //header 
      } 
      else{ 
       $deadlook=0; 
       for($y=0;$y <= count($awards);$y++) 
       { 
        if($awards[$y][0] == $contracts[$x][0]){ 
         unset($awards[$y][0]); 
         $line[$x]=array_merge($contracts[$x],$awards[$y]); 
         $deadlook=1; 
        }   
       } 
       if($deadlook==0) 
        $line[$x]=$contracts[$x]; 
      } 
     } 
    // 3 section  
     $fp = fopen('final.csv', 'w');//output file set here 

     foreach ($line as $fields) { 
      fputcsv($fp, $fields); 
     } 
     fclose($fp); 

是很難我解釋的代碼,因爲IAM從西班牙語的國家,所以我的英語心不是很好,但我可以嘗試

基本代碼有3個部分,

第1部分, 打開這2個文件並將內容放入數組$ awards []和$ contracts []中,所以$ awards [0]是awards.csv中的第一行,$ awards [1]是awards.csv等中的第二行,與$ contracts []中的相同。

第2

I比較的第一個字的每個陣列中,$獎勵[X] [0]和$合同[X] [0]。

第一個if,如果($ x == 0),是製作標題。 首先,我使用unset函數刪除第一個字contractname,並使用array_merge函數加入$ awards [0]和$ contracts [0]。

然後,使用這些for我從$ contracts數組中選擇每一行中的第一個單詞,並與$ awards數組中每行的第一個單詞進行比較。 so,if($awards[$y][0] == $contracts[$x][0])檢查這些第一個單詞(ej。Contract-2070-3are)是否相同,如果它們是相同的字符串,請將其刪除併合並這些行。

如果這些字不相同,則將$ contracts [x]行保存到$ line數組中並繼續。

第3部分, 將$ line數組中的內容保存在文件中。

+0

感謝你的工作。現在我想了解代碼。非常感謝你。你真棒和GENIUS – Raaz 2014-10-19 02:40:25

+0

你能告訴我如何解決這樣的問題嗎?我的意思是如何製作算法。我是一個新手,我非常願意學習 – Raaz 2014-10-19 02:47:03

+0

檢查,如果你有一個問題,我可以嘗試解釋,但我建議你嘗試閱讀更多的算法和數據結構,檢查這裏是否有任何鏈接可以幫助你http://www.quora.com/Are-there-any-good-sites-for-learning-algorithm-programming-concepts-every-day-similar-to-the-SAT-question-of-the-天 – kraysak 2014-10-19 03:59:31

0

這是一種面試問題嗎?你需要展示編寫算法的能力還是以現實的方式解決問題?

對於大數據集,我可能只需將csv轉儲到sqlite數據庫,每個csv使用一個表,然後將它們與查詢連接起來。

或者,您可以使用連接字段(contractName)作爲兩個數組的鍵,使用每個csv,$ contracts和$ awards填充兩個關聯數組。
然後你cicle鑰匙,並用每個陣列的給定鍵的內容的$最後一個數組:

$final = array(); 
$keys = array_keys($contracts); 
foreach($keys as $key) { 
    $final[] = array_merge($contracts[$key], $awards[$key]); 
} 
+0

這不是一個面試問題。這是我的學習算法的一部分,我意識到,因爲我是一個noob,它是非常困難的。 – Raaz 2014-10-19 02:42:08