| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > чтение строки по её номеру |
| Автор: Kirill89 21.10.2009, 10:21 | ||
| Доброе утро! Аналогичные вопросы уже встречал, но решения для себя не нашел. Интересует функция, позволяющая читать строку по её номеру из файла. есть файл: 1.txt
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, нет, длины строк не известны. Ипатьев,
а если последнюю надо прочитать? всё равно фактически грузим весь файл.
не флудите пожалуйста тему если не знаете ответа. если бы в данном коде я мог использовать ДБ, я бы не стал писать этот пост. |
| Автор: Ипатьев 21.10.2009, 10:43 |
не флудите, пожалуйста, если не владеете азами компьютерной грамотности ответ дан четко на поставленный вопрос. если вас интересовал другой вопрос - его и надо было задать. я бы порекомендовал вам держать свое мнение при себе. человек, который думает, что для записи данных в файл, его надо прочитать в память, с оценкой чужих знаний выглядит весьма глупо теперь о БД судя по остальным вопросам от таких же начинающих программистов, все препятствия к установке БД оказывались не такими уж страшными. и легко преодолеваются при наличии любознательности и трудолюбия. рекомендую поверить в свои силы и постараться освоить работу с базами данных. у вас обязательно получится. |
| Автор: Kirill89 21.10.2009, 10:48 | ||||||
Вам моё портфолио показать?
Причём тут запись? мне казалось, что мы говорим о чтении строки по её номеру из файла? или я как то не так выразился?
тут ключевое слово - ЧИТАТЬ |
| Автор: azesmcar 21.10.2009, 10:58 |
Ну тогда как я уже сказал, читать построчно. Работу можно оптимизировать проиндексировав файл, т.е. создать еще один файл, в котором будут лежать данные о смещении для каждой строки. Но это все уже смахивает на извращения, на самом ли деле файл такой огромный что это имеет значение и на самом ли деле использование базы невозможно? Насчет записи в конец файла, это делается просто, функция 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 | ||
Это в принципе то, что делат БД. Еще как вариант можно дополнять строки пробелами до определенной длины (тем самым устанавливая одну длину для всех строк). Но это все костыли. По моему для поддержки SqLite в php должен быть включен только модуль, я сомневаюсь что его отключили, вообще поддержка БД сейчас даже на бесплатных хостингах стоит, это немного странно. Проверьте все таки и поговорите с заказчиком в первую очередь, а уж потом пишите то, что уже давно написано.
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 | ||||||||
|