2014-10-17 4 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 

Структура линий в основном похожа, но разница лишь в том, что пятый столбец может содержать больше имен пользователей, поэтому мы должны читать всегда первые из него. Например: сценарий должен читать столбцы 4, 5 (как вы можете видеть, он должен прочитать самое первое имя, потому что он может быть расширен дополнительным, см.: 1-я и 2-я строки) и столбец 13. Итак, всего 4,5 , 13 столбцов от каждой последней 10 строк. Итак, мой вопрос заключается в том, как сделать скрипт для чтения последних 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

Ваш вставленный код не имеет ничего общего с чтением текстового файла ... пожалуйста, отправьте код, который ** относится ** к вопросу, который вы задаете. –

ответ

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); 

выход (я сделал некоторые данные, основанные на ваших линиях):

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

+0

На самом деле, как включить зарезервированные слова, которые строят оба или любые из этих слов, если они существуют в столбцах 5/13, которые нужно игнорировать? Word Word1, Word2 и т. Д.? – Monk25

+0

Вы бы лучше спросили об этом в качестве отдельного вопроса. Вам нужно указать ввод и вывод, а что делать с 10 строками - нужно больше анализировать? –

Смежные вопросы