Извлечение из ДИНАМИЧЕСКОГО текстового файла _ основная проблема PHP - PullRequest
0 голосов
/ 31 марта 2011

Я пытаюсь извлечь содержимое из текстового файла. Этот файл является динамическим, потому что данные продолжают добавляться к нему каждый раз, когда выполняется цикл. Внутри этого цикла лежит моя логика для извлечения содержимого из файла следующим образом ...

$length = filesize($filename);  
fseek($fd,$previousLength);  
$contents = fread($fd,(($length - $previousLength)));  
$previousLength = $length;  

Т.е. я пытаюсь прочитать только данные, которые были добавлены в последнем цикле ... а не данные, которые были ранее записаны. ПРИМЕР ... TXT добавляет ОДИН каждый раз, когда запускается цикл. То есть

114134, 144, 1443, 1433 ... 
(n of these written every once in loop ) ... 

Если я читаю n значений, скажем

114134, 144 ... 

в первом цикле ...

в следующий раз мне нужно только читать

1443, 1443 and NOT 114134, 144 ....

fread () терпит неудачу, и fseek не помогает (см. Мой код выше) ...

Я НЕ ЗНАЮ, ПОЧЕМУ !! нужна помощь как можно скорее ..

Спасибо

Ответы [ 2 ]

0 голосов
/ 31 марта 2011

Если вы открыли файл в режиме добавления, тогда справочная страница для fseek говорит:

Если вы открыли файл в режиме добавления (a или a +), любые данные, которые вы записываете в файл, всегда будут добавлены, независимо от положения файла, и результат вызова fseek () будет неопределенным.

Следующий код имеет несколько модификаций. У меня было несколько проблем с длиной - fread это требует, но я решил использовать fgets, чтобы избежать этого. Это остановит символы новой строки, но в противном случае будет удобной функцией чтения всего оставшегося содержимого файла. Возможно, есть лучший способ сделать это, но это работает.

<?php
$filename = 'loopFile.txt';
$previousLength = 0;
$n = 0;

$fw = fopen($filename, 'a+');
$fr = fopen($filename, 'r');

for ($i=0; $i < 15; $i++)
{
   // Put a random number of numbers into the file.
   $numberOfNumbers = rand(0, 5);

   for ($writeCount = 0; $writeCount < $numberOfNumbers; $writeCount++)
   {
      fwrite($fw, $i . '_' . $n++ . ', ');
   }

   fseek($fr, $previousLength);  
   $contents = fgets($fr);

   if (!empty($contents))
   {
      echo 'On iteration: ' . $i . ' read: ' . $contents . "\n";
   }
   else
   {
      echo 'On iteration: ' . $i . ' no new data appended to file.' . "\n";
   }

   $previousLength += strlen($contents);  
}

fclose($fw);
fclose($fr);

?>
0 голосов
/ 31 марта 2011

Не уверен, правильно ли я понял, но вы читаете данные из файла, который добавляете в тот же цикл?

Добавлены ли в файл данные, которые вы записываете все отдельные строки? Вместо этого вы можете посмотреть на команду file (), она считывает каждую строку в массив ... Затем вы можете array_slice () вывести правильные строки из массива, посчитав строки до и после ситуации.

...