2015-10-06 58 views
3

我打開一欄中的狀態爲兩列CSV,另一欄中爲m/d/y格式的交付日期。我想刪除重複的狀態條目,該條目的日期早於最近的相應日期。如果日期已過,則從CSV中刪除行

例如,如果CSV包含:

CA,1/5/16 
CA,4/8/15 
CA,3/2/15 
OR,3/4/15 
OK,3/4/14 

...我只想要存儲:

CA,1/5/16 
OR,3/4/15 
OK,3/4/14 

然後,我要交貨日期在這個新的數組比較到當前日期,並只顯示過去有日期的狀態(只有OR和OK)。爲了提供上下文,一個國家的交付來自不同的部分,我只想列出具有完全交付貨物的國家。

我被困在比較和刪除日期部分,但認爲我休息了。到目前爲止,我有:

<?php 

if (($handle = fopen("test.csv", "r")) !== FALSE) { 
    $row=0; 
    $csv_delivered = array(); 

    while (($line_of_text = fgetcsv($handle, 1000, ",")) !== FALSE) { 
     $date=$line_of_text[1]; 

     if(\DateTime::createFromFormat('m/d/y',$date) < new \DateTime()){ 
     //date is in the past 
      $csv_delivered[] = $line_of_text; 
     } 
    } 
    fclose($handle); 

    foreach ($csv_delivered as $delivered) { 
     $states_delivered.= $delivered[0].","; //state 
    } 
} 

?> 

    <p>Delivered: <?php echo $states_delivered; ?></p> 

回答

2

如果我有你的權利,

<?php 

if (($handle = fopen("test.csv", "r")) !== FALSE) { 
    $row=0; 
    $csv_delivered = array(); 
    $state_date = array();  // holds date of last occurence 
    $now = new \DateTime(); 

    while (($line_of_text = fgetcsv($handle, 1000, ",")) !== FALSE) { 
     // ignore data that are in the future 
     if ($state_date_min[$state]>$now) continue; 

     // prepare 
     $date=$line_of_text[1]; 
     $state=$line_of_text[0]; 
     $date = \DateTime::createFromFormat('m/d/y',$date); 

     // store if not existing or overwrite if this one is newer 
     if (!isset($state_date[$state]) || $date>$state_date[$state]) { 
      $csv_delivered[$state] = $line_of_text; 
      $state_date[$state] = $date; 
     } 

    } 
    fclose($handle); 

    foreach ($csv_delivered as $state => $delivered) { 
     $states_delivered.= $delivered[0].","; //state 
    } 
} 

?> 

    <p>Delivered: <?php echo $states_delivered; ?></p> 

記住每個狀態的日期和保存,如果不存在,或者如果新的覆蓋。不要忽略所有未來的數據。

+0

謝謝!非常接近 - 這清除了第一步的數據,但不再檢查日期是否過去。 – foolsgoat

+0

好的,編輯... – syck

+0

這仍然顯示CA(1/5/16),但正確地刪除任何未複製的狀態。它不應該顯示1/5/16,因爲它是未來日期。 – foolsgoat

相關問題