Консультация № 171733
29.08.2009, 20:31
0.00 руб.
0 12 2
Здравствуйте, эксперты!

Подскажите, как работать с текстовыми файлами из php.
Есть файл, в котором на отдельны[ строках забита нужная информация (см. приложение). Строк не много - 5-6, мне нужно получить каждую из них, а из самих строк получить отдельно каждую подстроку, которая разделена символом #.


Приложение:
1строка#информация1#информация2#информация3#информация4
2строка#информация5#информация6#информация7#информация8
3строка#информация9#информация10#информация11#информация12

Обсуждение

Неизвестный
29.08.2009, 21:46
общий
это ответ
Здравствуйте, Puma.

открыть файл функцией fopen
получить следующую строку из файла функцией fgets
создать массив подстрок функцией explode, разделитель - '#'
Неизвестный
30.08.2009, 06:21
общий
это ответ
Здравствуйте, Puma.
Не отрицая способа, указанного коллегой, подскажу более удобный. Для построчного чтения в PHP есть очень удобная функция file(). В качестве аргумента она принимает имя файла(т. е. путь к нему).
Какой же предлагается план действий?
Сначала получаем с помощью file() массив строк. Потом с помощью цикла и функции explode разбираем каждую строку на подстроки.
При одной и той же функциональности данный способ получается короче и производительнее, что немаловажно.

С уважением, Товарищ Бородин
5
Спасибо, Ваш ответ помог мне.
Неизвестный
02.09.2009, 02:55
общий
Можете еще взглянуть на fgetcsv
Неизвестный
02.09.2009, 15:56
общий
Никак не отрицая способа, указанного Академиком Товарищем Бородиным, хочу все же заметить, что сей способ употребим только в данном конкретном случае, когда файл маленький (как указано в вопросе). В случае же если файл большой, то лучше воспользоваться первым способом (построчным чтением). Почему? Да потому, что в варианте с функцией file() файл полностью читается в память и, соответственно, занимает ее.

При обработке больших файлов (например CSV), используя данный способ, я неоднократно наблюдал разные неприятные эффекты - как замедление работы, так и полную потерю работоспособности по причине превышения лимита отведенной памяти. И вот уже несколько лет как я забыл даже про существование такой функции как file(), испытывая к ней в какой-то степени иррациональное предубеждение ;)

А при наличии некоторого опыта первый способ отнюдь не так неудобен как может показаться. Достаточно один раз написать класс-итератор, после чего построчное чтение становится легким и красивым. Наример таким:
Код:

foreach(FileIterator('input.csv') as $line) {
//........
}
Неизвестный
03.09.2009, 03:53
общий
Никак не отрицая способа, указанного Практикантом Stright )), хочу все же заметить, что сейчас мы рассматриваем данный конкретный случай, когда файл маленький (как указано в вопросе).
При решении задач, ИМХО, стоит все-таки исходя из начальных условий выбирать наиболее простой и удобный способ... При чтении больших файлов, конечно же не стоит читать их в память полностью, но сейчас не тот случай, т.к. в вопросе конкретно стоит число строк файла...

Насчет класса-итератора... если в проекте не используются объектная модель, только функции? тогда оформлять лучше функцией а не классом... да и все-таки вопрос стоял именно в реализации, а не в оформлении... и неужели реализация класса будет проще:
Код:
foreach(file("d:/2.csv") as $row)
{
print_r(explode("#", $row));
}

или
Код:
$handle = fopen("d:/2.csv", "r");
while (($data = fgetcsv($handle, 1000, "#")) !== false) {
print_r($data);
}
fclose($handle);

?
хотелось бы взглянуть..

з/ы "иррациональное предубеждение" - зло, ИМХО.))

Неизвестный
03.09.2009, 10:50
общий
HookEst:
Мой предыдущий пост - это просто небольшое замечание на заданную тему. И смысл его исключительно в том, что не стоит рассматривать функцию file() как решение на все случаи жизни, следует ограничить ее применения данной конкретной задачей (и ей подобными).

Теперь - к вопросу о простоте реализации. Полагаю, что подавляющее большинство разработчиков никогда не пишет проектов с нуля. У каждого есть какая-то базовая библиотека (framework), которую он использует для построения проекта. Причем ничего удивительного, если в библиотеке используется объектная модель, а в проекте - только функции (хотя, где проблема в использовании объектов - не понимаю). И в данном случае простота реализации уходит на второй план, т.к. framework пишется один раз, а используется - множество. Нет проблем в том, что функция (или класс) имеет сложную реализацию. Главное - простота использования.

Но это уже, полагаю, тема для обсуждения уже не в данном мини-форуме.
Неизвестный
03.09.2009, 11:19
общий
Straight:
Мой предыдущий пост - это просто небольшое замечание на тему "иррационального предубеждения", просто MHO...
но все же, хотелось бы взглянуть на реализацию FileIterator..., ну и на простоту его использования...
Неизвестный
03.09.2009, 12:59
общий
реализация:
http://www.php.net/manual/en/function.fgetcsv.php#78228
но смысла в таких классах, ИМХО, абсолютно никакого...
Неизвестный
03.09.2009, 13:45
общий
Если Вы пишете простенький скриптик (вроде решения задачи, требуемого злым преподом), то смысла в них действительно никакого. А в крупном проекте - есть, причем немалый. Но, впрочем, у меня нет намерений переубеждать Вас. Не видите смысла в этих - значит, не сталкивались с необходимостью в них. А я сталкивался.
И свою реализацию, пожалуй, присылать Вам не стану - все равно Вы не видите в ней смысла.
Неизвестный
03.09.2009, 18:09
общий
Спасибо за ответы. Они оказались полезными.
Это не учебная задача.

Просто с mySQL сейчас возиться времени нет. Если кто-то согласиться за разумную цену написать скрипт для работы с БД, но там все намного сложнее будет: и сортировка, и расчет недостающих данных по данным БД, построение графиков по этим данным, вывод исходных и расчетных данных в таблицы html - с этим и еще много с чем другим разбираться придется.

А пока сделаю вот так на коленке, пока вполне хватит для начала.
Неизвестный
04.09.2009, 03:40
общий
Straight:
И свою реализацию, пожалуй, присылать Вам не стану

Гы, не надо, вряд ли она как-то отличается от реализации "mortanon@gmail.com"... или отличается?
А эти Ваши, т.н. крупные проекты, потому и крупные, что там, для каждой редкой, простой и узкоспециализированной операции (чтение CSV файла, ИМХО - то самое), заслуживающей разве что только перегружаемого метода, создается класс-обертка native функции, который не дает практически ничего нового, ни в функционале, ни в интерфейсе, ни в абстракции..., а наоборот, снижает читабельность, производительность и гибкость... А потом, через полгода, сами разработчики не могут вспомнить какую же проблему решали эти >9000 классов, реальную, гипотетическую или вообще никакую, просто руки чесались...
Изобретать пяти-колесный велосипед - это точно, что-то из области иррационального.
Успехов.
Неизвестный
04.09.2009, 12:56
общий
"не дает практически ничего нового"
"снижает читабельность, производительность и гибкость"
"просто руки чесались"
"пяти-колесный велосипед"
"из области иррационального"

Откуда столько агрессии? Повторяю: пишите как хотите, не собираюсь Вас уговаривать.
Форма ответа