2012-07-05 35 views
1

什麼是最明智的方法來計算獨立的名稱和最後發生(從數據)在管道分隔的平面文件中,其中數據形成像這樣:在平面文件中計算唯一值並將它們更新到數組

Artist|YYYY-MM-DD|Location|\n 

所以當數據是例如(與端部行):

The Band|2011-04-01|Club Bulc| 
Le Artist|1999-12-24|Reindeer Row| 
Soundmakers|2012-03-22|Pub Pizza| 
The Band|2010-12-01|Someplace| 
Soundmakers|2009-07-07|Faraway| 
Soundmakers|2010-08-18|ShowEr| 

和期望的格式將是:

Artist|Times listed|Latest year 

你將如何通過簡單文件循環得到以下數據爲第二平面文件:

Le Artist|1|1999| 
Soundmakers|3|2012| 
The Band|2|2011| 

起初,我認爲這將是一個相當簡單的任務,但事實證明了一點更具挑戰性!

我有一個實現半工作(有些項目被寫兩次,有時年份是在錯誤的行!),所以我想看看是否有一些更好的方法來完成這一點。

我已經嘗試了這兩種OOP和程序方法,到目前爲止,我已經用程序得到了更好的結果。但對我來說,這個方法並不重要,因爲這是我個人的學習(和使用)。

更新: 該文件大致爲1 MB,並且在可預見的將來遠低於10 MB。

回答

1

看起來很簡單的。你會想要的結果存儲數組是這樣的:

$bands = array(
    'Le Artist' => array('count' => 1, 'year' => 1999), 
    ... 
); 

您可以使用fgetcsv在線閱讀,並在同一時間打散他們:

$line = fgetcsv($fh, 0, '|'); 

就可以檢查你是否已經有這樣的藝術家和增加計數:

$artist = $line[0]; 
if (!isset($bands[$artist])) { 
    $bands[$artist] = array('count' => 0, 'year' => null); 
} 
$bands[$artist]['count']++; 

這一年,剛剛爆炸$line[1]提取年,檢查它是否比更高並且如果是的話就替換它。

+0

我用這兩者的組合,但這個答案包含更多實際的邏輯我最終使用的。謝謝! – 2012-07-05 18:33:13

1

首先,請與藝術家名作爲關鍵字的陣列,而當數值的年份列表:

$grouped = array(); 

while (!feof($fd) && $line = fgets($fd)) { 
    list($artist, $date) = explode('|', $line); 
    list($year) = explode('-', $date); 

    $grouped[$artist][] = $year; 
} 

然後輸出結果:

foreach ($grouped as $artist => $years) { 
    printf("%s|%s|%s|\n", $artist, count($years), max($years)); 
} 
0

這裏是我結束了使用的版本,和它的作品,我希望:

<?php 
$file = 'seen.txt'; 
$shows = array(); 
$sourceData = file($file); 
foreach($sourceData as $row) { 
    list($date, $artist, $venue, $city, $country) = explode('|', $row); 
    $year = date('Y', strtotime($date)); 
    if(!isset($shows[$artist])) { 
     $shows[$artist] = array('count' => 1, 'year' => $year); 
    } else { 
     $shows[$artist]['count']++; 
     if($shows[$artist]['year'] < $year) { 
      $shows[$artist]['year'] = $year; 
     } 
    } 
} 
echo '<h1>Bands and Shows</h1>'; 
ksort($shows); 
foreach($shows as $band => $data) { 
    echo 'I have seen <b>',$band,'</b> perform ',$data['count'],' times, most recently in ',$data['year'],'<br/>'; 
} 
?> 
相關問題