|
|
|
|
|
для: Trianon
(30.05.2006 в 14:41)
| | вы меня поняли :)
крута, большое спасибо!! | |
|
|
|
|
|
|
|
для: kaoz
(30.05.2006 в 14:39)
| | Недочитанная, а не недописанная. Да. | |
|
|
|
|
|
|
|
для: Trianon
(30.05.2006 в 14:32)
| | т.е. недозаписанная строка попадает в следующий блок? | |
|
|
|
|
|
|
|
для: kaoz
(30.05.2006 в 14:11)
| |
<?php
$blk_factor = 40000;
$handle = fopen($filename, "r"); // открываем файл
$block = ''; // при первом чтении в буфере предчтения пусто.
$sep = "\n"; // строки в файле разделены символом LF
while (!feof($handle)) // пока не достигнем конца файла
{ // дописываем к буферу очередной большой блок макс.размером $blk_factor
$block .= fread($handle, $blk_factor);
// разбиваем блок на строки и помещаем их в массив $lines
$lines = explode($sep, $block);
// вычисляем количество строк
$cnt = count($lines);
$block = $cnt <= 1 // если строка одна или ни одной, а также если
|| substr($block,-1,1) == $sep // последняя строка попала в буфер целиком
? "" //то мы всё обработаем до конца, и буфер будет пуст.
: $lines[--$cnt]; // иначе обрывок оставим в буфере, а число строк уменьшим
if($block != "") //
unset($lines[$cnt]); // и удалим обрывок из массива.
foreach($lines as $line)
echo $line.'<br>';
}
|
| |
|
|
|
|
|
|
|
для: Trianon
(30.05.2006 в 14:01)
| | я что-то не понял как это работает...
вы не могли бы прокоментировать? | |
|
|
|
|
|
|
|
для: kaoz
(30.05.2006 в 13:54)
| | Это делали те строки, которые Вы почему-то выбросили:
$block = $cnt <= 1 || substr($block,-1,1) == $sep
? "" : $lines[--$cnt];
if($block != "")
unset($lines[$cnt]);
|
| |
|
|
|
|
|
|
|
для: Trianon
(30.05.2006 в 13:47)
| | то что ничего не пропадает, понятно...
но вот как определять что это продолжение строки и как определить что в этом продолжении? | |
|
|
|
|
|
|
|
для: kaoz
(30.05.2006 в 13:31)
| | Тот код тоже расчитан на переменную длину строки. То, что в примере были одинаковые строки, еще ни о чем не говорит. Я проверял код и на строках произвольной длины.
И начальная часть строки, недочитанной при предыдущем чтении, дописывается в начало буфера при последующем. Так что ничего не пропадает.
Как читать одной операцией конкретное количество строк произвольной длины, я, лично, не знаю. По-моему, это просто неосуществимо. | |
|
|
|
|
|
|
|
для: Trianon
(30.05.2006 в 13:18)
| | по 100 не принципиально, можно в принципе сделать переменную где указывается сколько строк, хоть одна...
попробовал код под ссылкой, работает но не совсем так как надо...
дело в том что у меня не фиксированная длина строки, и тем кодом очень часто не захватывается последняя строка до конца...
а мне нужно чтобы я указал 100 строк, к примеру и он мне сохранил в массив 100 полных строк.. | |
|
|
|
|
|
|
|
для: kaoz
(30.05.2006 в 13:11)
| | А для Вас принципиально, чтобы именно по 100?
Код под ссылкой занимался именно этим.
Вытаскивал за раз много строк. Сколько поместилось.
Потом все эти строки обрабатывались иодним запросом уходили в базу.
Базе совсем не обязательно, чтобы в нее именно по 100 заливали. База не человек. | |
|
|
|
|