Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > чтение строки по её номеру


Автор: Kirill89 21.10.2009, 10:21
Доброе утро!
Аналогичные вопросы уже встречал, но решения для себя не нашел.
Интересует функция, позволяющая читать строку по её номеру из файла.

есть файл:
1.txt
Код

line 0
line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8
line 9

1) как прочитать конкретную строку (например 5) НЕ загружая весь файл в память?
2) как дописать в конец файла строку (например line 10) не загружая весь файл в память?

Автор: Ипатьев 21.10.2009, 10:24
1) читать по одной
2) как обычно
3) научиться пользоваться БД и перестать морочить себе и другим голову.

Автор: azesmcar 21.10.2009, 10:25
Если длины строк заранее известны можно сделать seek на интересующую позицию, в противно случае придется либо читать весь файл целиком, либо читать построчно пока не дойдешь до нужной строки.

Автор: Kirill89 21.10.2009, 10:35
azesmcar, нет, длины строк не известны.

Ипатьев
Цитата

1) читать по одной

а если последнюю надо прочитать? всё равно фактически грузим весь файл.
Цитата

3) научиться пользоваться БД и перестать морочить себе и другим голову. 

не флудите пожалуйста тему если не знаете ответа. если бы в данном коде я мог использовать ДБ, я бы не стал писать этот пост.

Автор: Ипатьев 21.10.2009, 10:43
Цитата(Kirill89 @  21.10.2009,  10:35 Найти цитируемый пост)
всё равно фактически грузим весь файл.

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

Цитата(Kirill89 @  21.10.2009,  10:35 Найти цитируемый пост)
если не знаете ответа

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

теперь о БД
судя по остальным вопросам от таких же начинающих программистов, все препятствия к установке БД оказывались не такими уж страшными. и легко преодолеваются при наличии любознательности и трудолюбия. рекомендую поверить в свои силы и постараться освоить работу с базами данных. у вас обязательно получится.

Автор: Kirill89 21.10.2009, 10:48
Цитата

от таких же начинающих программистов

Вам моё портфолио показать?
Цитата

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

Причём тут запись? мне казалось, что мы говорим о чтении строки по её номеру из файла? или я как то не так выразился?
Цитата

1) читать по одной

тут ключевое слово - ЧИТАТЬ

Автор: Ипатьев 21.10.2009, 10:57
Цитата(Kirill89 @  21.10.2009,  10:48 Найти цитируемый пост)
Причём тут запись?

так трудно отмотать страницу наверх и посмотреть? если уже забыли о чем писали 10 минут назад
пожалуйста, я напомню:
Цитата(Kirill89 @  21.10.2009,  10:21 Найти цитируемый пост)
как дописать в конец файла строку (например line 10) не загружая весь файл в память?

после таких вопросов никакого портфолио уже не надо.

итак, вернемся к вопросу.
только постарайтесь впредь писать внимательнее. 
Если бы я столкнулся в своей работе с подобной проблемой, то в первую очередь задал бы себе два вопроса:
1. В чем конкретно проблема прочитать весь файл по одной строчке.
2. В чем проблема воспользоваться базой данных?
Я думаю, вы уже ответили себе на них. Не затруднит вас кратко нас ознакомить с ответами? Я думаю, это будет вежливо - ведь вы обратились к нам за помощью. 

Автор: azesmcar 21.10.2009, 10:58
Цитата(Kirill89 @  21.10.2009,  10:35 Найти цитируемый пост)
azesmcar, нет, длины строк не известны.

Ну тогда как я уже сказал, читать построчно. Работу можно оптимизировать проиндексировав файл, т.е. создать еще один файл, в котором будут лежать данные о смещении для каждой строки. Но это все уже смахивает на извращения, на самом ли деле файл такой огромный что это имеет значение и на самом ли деле использование базы невозможно? 
Насчет записи в конец файла, это делается просто, функция http://php.net/manual/en/function.fopen.php принимает в качестве второго аргумента string $mode (тип открытия файла), если пройдете по ссылке вы увидите там возможные значения этого аргумента и их описания. Значение 'а' или 'a+' решит эту задачу.

Автор: Kirill89 21.10.2009, 11:05
Цитата

Работу можно оптимизировать проиндексировав файл

да, это вариант. спасибо.

Цитата

В чем конкретно проблема прочитать весь файл по одной строчке.

в том что файл весит приблизительно 70 Мб и строчек там порядка 15 000.
если мне понадобится строка номер 14 999, то мне придётся пройтись по всему файлу для её прочтения.
Цитата

В чем проблема воспользоваться базой данных?

на сервере заказчика НЕТ поддержки баз данных.

Автор: lelik133 21.10.2009, 11:09
и что проще иметь геморрой и расставлять костыли для чтения n-ой строки или убедить заказчика сменить хостинг?

Автор: Ипатьев 21.10.2009, 11:10
Всегда меня радовали такие объяснения. 
А если у заказчика и сервера нет - тогда что? 
Если для решения какой-то задачи нужен инструмент - этот инструмент должен быть использован. 

Как вы узнали, что на сервере нет поддержки баз данных? Какие именно БД вы проверяли?

Автор: Kirill89 21.10.2009, 11:13
lelik133, хороший вопрос =)
заказчики бывают разные...

Добавлено через 1 минуту и 48 секунд
Ипатьев, я работаю только в mysql, mssql и oracle. этих баз там нет.

Автор: azesmcar 21.10.2009, 11:17
Цитата(Kirill89 @  21.10.2009,  11:05 Найти цитируемый пост)
да, это вариант. спасибо.

Это в принципе то, что делат БД. Еще как вариант можно дополнять строки пробелами до определенной длины (тем самым устанавливая одну длину для всех строк). Но это все костыли.

Цитата(Kirill89 @  21.10.2009,  11:05 Найти цитируемый пост)
на сервере заказчика НЕТ поддержки баз данных. 

По моему для поддержки SqLite в php должен быть включен только модуль, я сомневаюсь что его отключили, вообще поддержка БД сейчас даже на бесплатных хостингах стоит, это немного странно. Проверьте все таки и поговорите с заказчиком в первую очередь, а уж потом пишите то, что уже давно написано.

Цитата(Kirill89 @  21.10.2009,  11:13 Найти цитируемый пост)
Ипатьев, я работаю только в mysql, mssql и oracle. этих баз там нет. 

SqLite практически ничем не отличается от mysql, да и на таком примитивном уровне работы с БД знания не помеха, если знаете SQL - то знаете все базы, в конце концов все они поддерживают ANSI SQL.

Автор: Kirill89 21.10.2009, 11:25
azesmcar, сейчас буду разбираться с sqlite. это явно проще индексации файла в ручную =)

Автор: Ипатьев 21.10.2009, 11:26
Я так понимаю, что вопрос возник из предположения, что организовать поиск в неструктурированном файле проще, чем заниматься организацией базы данных. Сейчас обстоятельства изменились. 
Судя по вопросам, я, все-таки, предположу, что уровень знаний по принципам работы операционных систем вряд ли позволит сделать работающую модель БД на коленке. Блокировки, к примеру, с большим трудом даются начинающим. В общем, если нужно оптимальное решение - то оно организационное. А если хочется приключений - то пишите, конечно.

Автор: Kirill89 21.10.2009, 11:35
Всем спасибо за ответы.
В итоге воспользуюсь советом azesmcar по поводу sqlite.
Ипатьев, Вам отдельное спасибо.
И действительно, зачем решать задачу, проще доказать что она не целесообразна. 

Автор: nerezus 21.10.2009, 14:31
Цитата

Ипатьев, Вам отдельное спасибо.
И действительно, зачем решать задачу, проще доказать что она не целесообразна. 
 Я рад, что все решилсь. Я уже хотел накидать в вас десяток ОБОСНОВАННЫХ лучей поноса за вышестоящие посты. Оставлю лишь актуальные ) Остальные вытер. А вот это прими к сведению:

Цитата

не флудите пожалуйста тему если не знаете ответа.
 Не груби людям, которые тебе помогают и дают ОЧЕНЬ ПОЛЕЗНЫЕ советы.

Цитата

 если бы в данном коде я мог использовать ДБ, я бы не стал писать этот пост.
 Ну прям конечно. А сами задаете такой "суперсложный" вопрос при этом. Ипатьев увидел твой уровень и предложил разумное решение.

Цитата

Вам моё портфолио показать?
 Количество решенных задач совершенно не связано с уровнем знаний. Я за это отвечаю: не раз приходилось переделывать заваленные проекты, которые работали, но их поддержка и доработка были финансово невыгоднее переделывания.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)