PHP

Как следует работать с текстовыми файлами?

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

Есть такой вариант: В дополнительном файле перечислять номера удалённых строк (но в файле их оставить) и просто не выводить их. И потом (когда накопится много удалённых строчек), можно будет за один раз удалить эти строчки.

Что бы вы предложили? Понимаю, велосипед и всё это реализовано в СУДБ, но хотелось бы узнать, как следует работать с обычными текс. файлами (с CSV, например).
Тут вопрос в том, насколько много...

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

А вот если это десятки гигабайт, то тут действительно придётся как-то оптимизировать.
VB
Vuqar Bayramov
77 114
Лучший ответ
Михаил Зуев Про считывать весь файл в память - это тебя обманули.
а чем БД не устраивает?
Макс Кайстра
Макс Кайстра
54 847
Алексей Киселев БД устраивает всем.
Если открывать как бинарный файл, то с помощью seek можно перескочить на нужный байт и записать туда что-то или считать, при этом не трогая то, что выше и ниже.
БД по этому принципу и работают.
Yevgeniy Sokolov
Yevgeniy Sokolov
26 662
Алексей Киселев А разве такое возможно - не трогая записывать?
Насколько мне известно, происходит перезапись существующих данных при записи в поток.
А вас не интересовало, КАК ИМЕННО эти самые СУБД это делают?

Просто 3 варианта:
1. Нарезать большой файл на кучу маленьких
2. Хранить список удалённых/измененных строк отдельно и применять изменения при запросе на нужный диапазон
3. Помечать строки как удалённые в самом файле и периодически устраивать сборку мусора

Можно накидать ещё вариантов. Можно их комбинировать.
че че?.. переписывать? вы с какой планеты? да и функция инклюда есть
Alisher Нуркен0В
Alisher Нуркен0В
7 384
Алексей Киселев Иклюда? А она тут при чём?
Vuqar Bayramov Тут вопрос в том, насколько много... Если максимальный размер файла - пара сотен мегабайт, то он целиком считывается в RAM, модифицируется и целиком же записывается на диск - это будет работать достаточно быстро.

А вот если это десятки гигабайт, то тут действительно придётся как-то оптимизировать.
На самом деле, удаление - не основная проблема при работе с текстовым файлом.
Поиск, как бы, происходит куда чаще, чем удаление. И с большим файлом без произвольного доступа у тебя сервер встанет колом от чтения куда раньше, чем от записи.

Так что пили, дядя, свой унылый велосипед для БД дальше.

А нормальные люди будут хранить данные в БД, и получать csv файл только когда он нужен, экспортом из БД.
Алексей Киселев Что плохого в велисипеде, папаш? :)
Так, для забавы можно написать, но лучше пока этим не заниматься, так как я слабо себе представляю, как там ОС хранит файлы на диске.
Для начала, нужно с этим разобраться.