2014-10-17 158 views
0

以下功能DMMRankings()用於顯示排名靠前的25位用戶。但是,我想編輯這個函數來讀取一個文本文件(它會有很多行,比如20.000),所以它需要總是讀取最後10行,因爲它會是一團糟。例如,從文本文件的兩行:如何讀取文件的最後10行並獲取所需的數據?

1,42,16, 201,stackoverflow_user, 1, 6762160, 39799, 9817242, 6762160, 39884, 10010545,stackoverflow_usersecond, 2, 1351147, 1165, 483259, 1351147, 1115, 241630, 0 
1,46,27, 201,[stackoverflow_user | stackoverflow_userother], 1, 4078465, 286991, 1594830, 4078465, 287036, 1643156,stackoverflow_userthird, 2, 1357147, 1115, 241630, 1357147, 1065, 120815, 0 

線的結構主要是similiar但唯一不同的是,第5列可以包含多個用戶名,所以我們必須始終閱讀第一它。它是這樣的:腳本應該讀第4,5列(正如你可以看到它應該讀第一個名字,因爲它可以額外擴展,參見:第一行和第二行)和第13列。所以,總共4,5 ,每行最後10行13列。 所以我的問題是如何使腳本從這個特定的文本文件中讀取最新的10行和特定列?

必須編輯的腳本:

function DMMRankings() 
    { 
     $db = $this->database[GDB]; 
     $num_rows = $db->doQuery('SELECT TOP 25 UserName, Rank, Nation FROM USER WHERE Authority IN(1, 2) ORDER BY Rank DESC'); 
     if ($num_rows == -1) 
     { 
      $db->getError(); 
      return; 
     } 

     $n = 1; 
     $content = ''; 
     while ($row = $db->doRead()) 
     { 
      $data = array('rank-pos' => $n++, 'rank-name' => $row['UserName'], 'rank-nation' => $row['Nation'], 'rank-user' => number_format(intval($row['Rank']))); 
      $content .= Template::Load('rankinguserdmm-' . ($n % 2 == 1 ? 2 : 1), $data); 
     } 

     $this->content = Template::Load('user_rankingsdmm', array('rankings' => $content)); 
    } 
+0

您的粘貼代碼與閱讀文本文件無關......請發佈**相關**的代碼以提問您的問題。 – 2014-10-17 12:03:42

回答

0

下面的代碼將完成你的使命:

# read a file into an array 
$lines = file('/path/to/file.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); 

# take the last 10 lines of the file -- i.e. the last 10 values in the array 
$last_ten = array_slice($lines, -10); 

#create an array for the output 
$output = array(); 

foreach ($last_ten as $l) { 
    # treat the data as comma-separated values 
    $arr = explode(",", $l); 
    # if col 5 has multiple values, take the first one 
    if (preg_match("/\[(.+?) \|/", $arr[4], $matches)) { 
     $arr[4] = $matches[1]; 
    } 
    # store the data we want in an output array. 
    $output[] = array($arr[3], $arr[4], $arr[12]); 
} 
print_r($output); 

輸出(I由根據你的線條一些數據):

Array 
(
    [0] => Array 
     (
      [0] => 201 
      [1] => stackoverflow_user_7 
      [2] => stackoverflow_usersecond 
     ) 

    [1] => Array 
     (
      [0] => 201 
      [1] => stackoverflow_user_8 
      [2] => stackoverflow_userthird 
     ) 

(等)

+0

我會馬上測試它。請最後一件事,因爲我在測試之前真的很難做到這一點。僅當用戶名之間沒有空格時,如何閱讀第5,13列。讓我們說第5或13行,用戶名如下:'stack overflow_user_7'將被跳過?所以它只會讀取沒有(空格)的行 – Monk25 2014-10-17 13:13:02

+0

實際上,如果在第5/13列中存在忽略這兩個或任何這些單詞的保留字,如何包含保留字呢?詞Word1,Word2等? – Monk25 2014-10-17 13:35:47

+0

作爲一個單獨的問題,你會做得更好。你需要指定輸入和輸出,以及如何處理10行 - 應該更多地被解析? – 2014-10-17 13:44:19

相關問題