Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: получить данные из последней строки
 
 автор: Gеоргий   (20.10.2008 в 21:38)   письмо автору
 
 

Приветствую всех!
Спасибо авторам за хорошие книги и за архив форума на диске!
Нужна помощь в решении одной задачи, кто знает, подскажите!
Как получить данные из последней строки файла?
нужно получить первые n-символов, а лучше все символы до определенного знака, например "|"
Если правильно понял, нужно использовать fseek() со значением -1
Подскажите, как это грамотно реализовать. Наверное нужна будет проверка, последняя строка пустая.
Конечно можно данные считать в массив и развернуть его, но это не правильно, поскольку может занять лишку времени.
С уважением, Георгий

  Ответить  
 
 автор: mehelson   (21.10.2008 в 05:05)   письмо автору
 
   для: 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Мб)

  Ответить  
 
 автор: Gеоргий   (21.10.2008 в 16:43)   письмо автору
 
   для: 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|и т. д.|||

С уважением, Георгий

  Ответить  
 
 автор: mechanic   (21.10.2008 в 16:45)   письмо автору
 
   для: Gеоргий   (21.10.2008 в 16:43)
 

можно использовать microtime(1) (или его часть) в качестве ключа, если неразрывность арифметической прогрессии здесь не важна

  Ответить  
 
 автор: Gеоргий   (22.10.2008 в 23:20)   письмо автору
 
   для: mechanic   (21.10.2008 в 16:45)
 

Хотелось, чтоб было по порядку:
10001
10002
10003
и т.д.
С уважением, Георгий

  Ответить  
 
 автор: Trianon   (22.10.2008 в 23:35)   письмо автору
 
   для: Gеоргий   (22.10.2008 в 23:20)
 

Так а что мешает брать в качестве ключа следующее по порядку число?

  Ответить  
 
 автор: mehelson   (22.10.2008 в 05:27)   письмо автору
 
   для: 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);
?>

  Ответить  
 
 автор: Gеоргий   (22.10.2008 в 23:17)   письмо автору
 
   для: mehelson   (22.10.2008 в 05:27)
 

А если верхняя строка, ну или другая, будет перемещена вниз - отсчет пойдет заново, и строки будут с одинаковыми ключами :(

Насчет 5-ти мегабайт за доли секунды....
Т.е. Вы хотите сказать, выполняется запрос, файл объемом 5мб на удаленной машине считывается в память, обрабатывается, выдается результат... и все это за доли секунды?
Сомневаюсь я. Сервер должен быть слишком не загружен, железо шибко крутое, ну и у Вас с ним связь хорошая...все это вместе редко встречается.
С уважением, Георгий

  Ответить  
 
 автор: mehelson   (23.10.2008 в 06:56)   письмо автору
 
   для: 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);
?>

  Ответить  
 
 автор: Евгений Петров   (23.10.2008 в 18:38)   письмо автору
 
   для: 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) . '"';
}


медленнее (хотя не факт), зато надежно.

  Ответить  
 
 автор: Gеоргий   (24.10.2008 в 00:34)   письмо автору
 
   для: mehelson   (23.10.2008 в 06:56)
 

Спасибо, Mehelson и Евгений!
Попробую!
С уважением, Георгий

  Ответить  
 
 автор: Gеоргий   (26.10.2008 в 14:01)   письмо автору
 
   для: mehelson   (23.10.2008 в 06:56)
 

А если не переписывать файл, как просто вычислить получившееся значение?
Вместо:

$h = fopen($filename,"a"); 
fwrite($h, (max($tarr)+1)."|строка данных\r\n"); 
fclose($h);

Надо, предположим присвоить это значение переменной:

$key = че-то там max($tarr)+1

Как это правильно прописать?
С уважением, Георгий

  Ответить  
 
 автор: mehelson   (26.10.2008 в 16:26)   письмо автору
 
   для: Gеоргий   (26.10.2008 в 14:01)
 

Файл не переписывается.
Данные заносятся в конец файла, благодаря второму параметру - "а" функции fopen()
Максимальное значение так и присвоить:
вместо
$h = fopen($filename,"a"); 
fwrite($h, (max($tarr)+1)."|строка данных\r\n"); 
fclose($h);
это
$key = max($tarr);

  Ответить  
 
 автор: Gеоргий   (26.10.2008 в 22:55)   письмо автору
 
   для: mehelson   (26.10.2008 в 16:26)
 

Немного сам затупил, уже разобрался, все работает!
Спасибо Mehelson!
С уважением, Георгий

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования