Найти и изменить строку в файле?

Каким образом перезаписать строку в файле притом изменив еее $elem[0] тоесть $id изменить на $ref?
файл
5678<|>Петро Бойко<|>2019-02-17<|>
1111<|>Петро Бойко<|>2022-04-26<|>
1234<|>Петро Бойко<|>2022-04-26<|>

$id = '1111';
		
		$ref = '2222';
        		
		$cont='';
		$file = file("../data/ref_log.dat");
		$zap = false;
		foreach($file as $line){
			$elem = explode("<|>",$line);
			if ( $elem[0] == $id ){

				$cont = $cont.$id."<|>".$name."<|>".$date."<|>\r\n";
				$zap = true;

	        }
			else $cont = $cont.$line;
		}
		if ( !$zap ) $cont.= $ref."<|>".$name."<|>".$date."<|>\n";

		if(!file_put_contents('../data/ref_log.dat', $cont));
  • Вопрос задан
  • 70 просмотров
Пригласить эксперта
Ответы на вопрос 1
@rPman
есть 2 подхода по редактированию файлов:
1. ты находишь место в файле (буквально смещение в байтах), открыв его на чтение и запись fopen(...,'r+') читая его помощью fread или fgets или еще какой функцией (позиция будет перемещаться на следующую для чтения), перемещаешь в нужное место позицию fseek и делаешь запись fwrite или fputs, заменяя содержимое, без сдвига данных после него

этот способ подходит если заменяемые данные равны по длине с предыдущими

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

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

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

p.s. третий способ состоит в том что сначала файл целиком загружается в память (не важно каким способом, целиком, построчно или разобранный по объектам), в памяти он редактируется как надо, и сохраняется обратно.
В этом способе можно сохранять файл в тот же файл что и был, открыв его fopen..'w+') - что очистит файл при открытии, а значит проблемы с местом на диске менее вероятны, но если произойдет какая либо ошибка то содержимое будет потеряно, рекомендуется точно так же сначала сохранить файл в новый, удостовериться что все прошло как надо и уже после удалить оригинал и переименовать новый.

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

Некоторые файловые системы предоставляют инструменты для реализации транзакций но в php для этого нет инструментов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы