помощь в оптимизация кода file() explode()

ajumi

Новичок
помощь в оптимизация кода file() explode()

Задача сохранить данные из file.txt с выборкой определенных полей в файл file.html
исходный файл состоит из строк с данными разделенных символами табуляции.
скрипт работает только с файлами небольшого размера, как улучшить или изменить код, чтобы не возникало проблем с нехваткой памяти и можно было работать с файлами свыше 100мб.
PHP:
<?php 
$f = fopen("file.html", "w");  
$myfile = 'file.txt'; $lines = file($myfile); 
for($i=count($lines);$i>0;$i--){  
$str_exp = explode("\t", $lines[0]);  
$a = $str_exp[2]."\t".$str_exp[4]."\t".$str_exp[5]."\t".$str_exp[7]."\n"."<br>"; 
fwrite($f, $a); 
} 
fclose($f); 
?>
 

Lews

Новичок
Как ни странно - не считывать сразу весь файл в память, а читать построчно c помощью того же fopen.

У тебя в цикле, кстати, используется одна и так же строка все время:
PHP:
$str_exp = explode("\t", $lines[0]);
 

ajumi

Новичок
Спасибо за помощь!
подправил скрипт, вроде шустрее работать стал)
PHP:
<?php
    $h = fopen("file.html", "w");
    $f = fopen ("file.txt", "r");
    while (!feof($f)){
         $line = fgets($f);
         $str_exp = explode("\t", $line);
        $a = $str_exp[2]."\t".$str_exp[4]."\t".$str_exp[5]."\t".$str_exp[7]."\n"."<br>";
        fwrite($h, $a);
      }
    fclose ($f);
    fclose ($h);
?>
возник еще один вопрос, перед записью в файл, строки нужно сгруппировать, например у строк с полем(N) нужно суммировать поле(X), что лучше использовать в этом случае, чтобы не загружать память?
 

zerkms

TDD infected
Команда форума
findnext
Пусть делает - он же не просил готового ответа :) А это уже о многом говорит.
 

findnext

Новичок
zerkms
согласен, да в это же самое время у нас тестовые задания делают...я и подумал что "один из них" :)
 

ajumi

Новичок
одно решение пока только придумал, создал в памяти массив и по ходу чтения строк сравниваю поля
PHP:
 while (!feof($f)){
         $line = fgets($f);
         $str_exp = explode("\t", $line);
         for($i=1; $i<=500; $i++)
{
if($names1[$i]==$str_exp[4]){$value[$i]= $value[$i]+$str_exp[7];}
}

         }
работает, но с файлами большого размера виснет...
 

findnext

Новичок
большой фаил какой бы он ни был можно всегда разбить по подфаилам...

-~{}~ 26.10.10 14:57:

у тебя фаил в одну строку???

-~{}~ 26.10.10 14:58:

$line = fgets($f); что это такое????
 

ajumi

Новичок
имеется ввиду построчно файл читается, затем создается массив str_exp который уже сравнивается с созданным ранее массивом и суммируются значения

-~{}~ 26.10.10 17:55:

по подфайлам я попробовал разбивать, но тогда некоторые строки обрезаются и теряются данные
 

findnext

Новичок
ajumi
1.что у тебя за фаил??? в нём переводы строк есть? твой fgets без указания длинны будет читать фаил полностью если он в одну строку...

2. Что значит обрезаются?? Читай побайтово и ничего не будет обрезаться....

-~{}~ 27.10.10 00:44:

и замени fgets на fgetscsv
 
Сверху