|
|
|
| Приветствую всех!
Спасибо авторам за хорошие книги и за архив форума на диске!
Нужна помощь в решении одной задачи, кто знает, подскажите!
Как получить данные из последней строки файла?
нужно получить первые n-символов, а лучше все символы до определенного знака, например "|"
Если правильно понял, нужно использовать fseek() со значением -1
Подскажите, как это грамотно реализовать. Наверное нужна будет проверка, последняя строка пустая.
Конечно можно данные считать в массив и развернуть его, но это не правильно, поскольку может занять лишку времени.
С уважением, Георгий | |
|
|
|
|
|
|
|
для: Gеоргий
(20.10.2008 в 21:38)
| | >считать в массив и развернуть его, но это не правильно, поскольку может занять лишку времени.
Неприлично большие файлы ?
код:
<?
$filename = "test.txt";
if(file_exists($filename)) $content = file($filename);
else exit("error");
$str = explode("|", $content[count($content)-1]);
echo $str[0];
?>
|
за сотые доли секунды обработал файл в 205884 строк (более 5Мб) | |
|
|
|
|
|
|
|
для: mehelson
(21.10.2008 в 05:05)
| | Спасибочки Mehelson, премного благодарен!
Опять неувязка получилась, недодумал сразу, если строки поменять - все напрасно!
Суть в том:
есть текстовый файл базы,
строки считываются в массив $lines, обращение по ключу,
ключ генерируется рандомный mt_rand(10000,99999);
этот ключ прописывается нулевым элементом массива dt[0],
файл выглядит примерно так:
51018|name|login|email|и т. д.|||
83755|name2|login2|email2|и т. д.|||
25427|name3|login3|email3|и т. д.|||
40113|name4|login4|email4|и т. д.|||
|
Вопрос - как сделать ключ не рандомным?
Чтоб массив записывался в базу так:
10001|name|login|email|и т. д.|||
10002|name2|login2|email2|и т. д.|||
10003|name3|login3|email3|и т. д.|||
10004|name4|login4|email4|и т. д.|||
|
С уважением, Георгий | |
|
|
|
|
|
|
|
для: Gеоргий
(21.10.2008 в 16:43)
| | можно использовать microtime(1) (или его часть) в качестве ключа, если неразрывность арифметической прогрессии здесь не важна | |
|
|
|
|
|
|
|
для: mechanic
(21.10.2008 в 16:45)
| | Хотелось, чтоб было по порядку:
10001
10002
10003
и т.д.
С уважением, Георгий | |
|
|
|
|
|
|
|
для: Gеоргий
(22.10.2008 в 23:20)
| | Так а что мешает брать в качестве ключа следующее по порядку число? | |
|
|
|
|
|
|
|
для: Gеоргий
(21.10.2008 в 16:43)
| | >Вопрос - как сделать ключ не рандомным?
или как-нибудь так:
<?php
$filename = "test.txt";
if(file_exists($filename)) $content = file($filename);
else exit("error");
$str = explode("|", $content[count($content)-1]);
$h = fopen("test.txt","a");
fwrite($h, ($str[0]+1)."|строка данных\n");
fclose($h);
?>
|
| |
|
|
|
|
|
|
|
для: mehelson
(22.10.2008 в 05:27)
| | А если верхняя строка, ну или другая, будет перемещена вниз - отсчет пойдет заново, и строки будут с одинаковыми ключами :(
Насчет 5-ти мегабайт за доли секунды....
Т.е. Вы хотите сказать, выполняется запрос, файл объемом 5мб на удаленной машине считывается в память, обрабатывается, выдается результат... и все это за доли секунды?
Сомневаюсь я. Сервер должен быть слишком не загружен, железо шибко крутое, ну и у Вас с ним связь хорошая...все это вместе редко встречается.
С уважением, Георгий | |
|
|
|
|
|
|
|
для: Gеоргий
(22.10.2008 в 23:17)
| | >и все это за доли секунды?
Думаю, да. Ну может быть чуть дольше... За секунду или 2, например.
>ну и у Вас с ним связь хорошая...
Обработка происходит на сервере.
В пути только запрос и результат. Или нет ?
>А если верхняя строка, ну или другая, будет перемещена вниз - отсчет пойдет заново, и строки будут с одинаковыми ключами :(
Можно искать максимальное значение:
<?php
$content = file($filename);
for($i=1; $i<count($content); $i++)
{
$arr = explode("|", $content[$i]);
$tarr[] = $arr[0];
}
$h = fopen($filename,"a");
fwrite($h, (max($tarr)+1)."|строка данных\r\n");
fclose($h);
?>
|
| |
|
|
|
|
|
|
|
для: mehelson
(23.10.2008 в 06:56)
| | Господа! Ну нельзя же так!
file(), file_get_contents() - забудьте про эти функции, если храните данные в файлах. Файл в 100 мегабайт это не фантастика - это реальность!
<?php
$filename = "D:/test.txt";
$f = fopen($filename, "r");
if ($f)
{
while(!feof($f))
{
$line = fgets($f);
}
echo 'The last line is: "' . htmlspecialchars($line) . '"';
}
|
медленнее (хотя не факт), зато надежно. | |
|
|
|
|
|
|
|
для: mehelson
(23.10.2008 в 06:56)
| | Спасибо, Mehelson и Евгений!
Попробую!
С уважением, Георгий | |
|
|
|
|
|
|
|
для: mehelson
(23.10.2008 в 06:56)
| | А если не переписывать файл, как просто вычислить получившееся значение?
Вместо:
$h = fopen($filename,"a");
fwrite($h, (max($tarr)+1)."|строка данных\r\n");
fclose($h);
|
Надо, предположим присвоить это значение переменной:
$key = че-то там max($tarr)+1
|
Как это правильно прописать?
С уважением, Георгий | |
|
|
|
|
|
|
|
для: Gеоргий
(26.10.2008 в 14:01)
| | Файл не переписывается.
Данные заносятся в конец файла, благодаря второму параметру - "а" функции fopen()
Максимальное значение так и присвоить:
вместо
$h = fopen($filename,"a");
fwrite($h, (max($tarr)+1)."|строка данных\r\n");
fclose($h);
| это
| |
|
|
|
|
|
|
|
для: mehelson
(26.10.2008 в 16:26)
| | Немного сам затупил, уже разобрался, все работает!
Спасибо Mehelson!
С уважением, Георгий | |
|
|
|