2012-04-25 4 views
1

У меня есть файл в форматебыстрый способ найти найти мин/макс/Avg значения в файле

1 52 
2 456 
3 4516 
5 4545 
6  41 

что бы самый быстрый способ чтения в файл и получить мин/макс/Avg значения во втором столбце в PHP?

+0

PHP уже есть кое-что для разбора файлов по линии .... это функция называется ... ' file() ' Это говорит о том, что решение @ mellamokb довольно мило, оно решает разбор, а также разбивает файл за пределами PHP-кода, следовательно, он должен быть быстрее, чем просто PHP. – Christian

+0

Каков размер файла? –

ответ

1

Что-то вроде следующего, где <filename> - путь к файлу.

$file = fopen('<filename>', 'r'); 

$a = 0; 
$b = 0; 
$first = true; 
while (fscanf($file, '%d%d', $a, $b)) { 
    if ($first) 
    { 
     $min = $b; 
     $max = $b; 
     $total = $b; 
     $count = 1; 
     $first = false; 
    } 
    else 
    { 
     $total += $b; 
     if ($b < $min) $min = $b; 
     if ($b > $max) $max = $b; 
     $count++; 
    } 
} 
$avg = $total/$count; 

Демо: http://ideone.com/rWbqm

+0

Это дало мне «Время прохода по ссылке было устарело», это нормально, если я удалю &? – user391986

+0

Если я это сделаю, это дает мне «неопределенную переменную a» – user391986

+0

@ user391986: Ах, да, я считаю, что вы можете. Возможно, вам придется задавать значения «$ a» и «$ b» для значений по умолчанию. См. Обновление. Также добавлен пример того, как открыть файл с помощью '' fopen' '(http://php.net/fopen) – mellamokb

1

Сделаны некоторые улучшения производительности от кода @mellamokb:

$file = fopen('<filename>', 'r'); 

$a = $b = 0; 
if (fscanf($file, '%d%d', $a, $b)) 
{ 
    $min = $max = $total = $b; 
    $count = 1; 
    while (fscanf($file, '%d%d', $a, $b)) 
    { 
     $total += $b; 
     if ($b < $min) $min = $b; 
     else if ($b > $max) $max = $b; 
     ++$count; 
    } 
    $avg = $total/$count; 
} 
else 
{ 
    // Do something here as there is nothing in the file 
} 
+0

Улучшения производительности? Выглядит функционально одинаково, хотя и немного более кратким. Если 'if ($ first)' намного медленнее, чем я думал ;-) – mellamokb

+0

Сохраняет строку 'if $ first' каждую строку после первого. Также пропускает проверку, если он нашел новый минимум. Это зависит от размера файла, который я предполагаю. –

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