Delphi переписать строку в текстовом файле
Репутация: нет
Всего: нет
"Найти текст в текстовом файле и заменить его" - как реализовать вот это?
поиск строки в текстовом файле:
Код |
uses SysUtils, Classes; |
function GrabLine(const AFileName: string; ALine: Integer): string;
var
fs: TFileStream;
buf: packed array[0..4095] of Char;
bufRead: Integer;
bufPos: PChar;
lineStart: PChar;
tmp: string;
begin
fs := TFileStream.Create(AFileName, fmOpenRead);
try
Dec(ALine);
bufRead := 0;
bufPos := nil;
function GrabLine2(const s: string; ALine: Integer): string;
var
sl: TStringList;
begin
sl := TStringList.Create;
try
sl.LoadFromFile(s);
Result := sl[ALine - 1]; // index off by one
finally
sl.Free;
end;
end;
begin
Writeln(GrabLine(ParamStr(1), StrToInt(ParamStr(2))));
Writeln(GrabLine2(ParamStr(1), StrToInt(ParamStr(2))));
end.
Код |
procedure FileReplaceString(const FileName, searchstring, replacestring: string); var fs: TFileStream; S: string; begin fs := TFileStream.Create(FileName, fmOpenread or fmShareDenyNone); try SetLength(S, fs.Size); fs.ReadBuffer(S[1], fs.Size); finally fs.Free; end; S := StringReplace(S, SearchString, replaceString, [rfReplaceAll, rfIgnoreCase]); fs := TFileStream.Create(FileName, fmCreate); try fs.WriteBuffer(S[1], Length(S)); finally fs.Free; end; end; |
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Центр помощи | Следующая тема » |
[ Время генерации скрипта: 0.1065 ] [ Использовано запросов: 21 ] [ GZIP включён ]
← →Андрей Пл ( 2007-09-03 10:15 ) [0]
Мне нужно изменить определенную строку в текстовом файле, только вот не пойму как это сделать! Как заполнить новый файл я знаю, как добавить в конец существующего тоже понятно:
assignFile(varFile, fileReport);
if not FileExists(fileReport) then
rewrite(varFile)
else
Append(varFile);
. . . . . . . . .
Writeln(varFile, str);
А как изменить в существующем файле например вторую строку.
Заранее спасибо.
Сергей М. © ( 2007-09-03 10:24 ) [1]
Для сравнительно небольшого файла:
with TStringList.Create;
try
LoadFromFile(fileReport);
Strings[1] := "Новое содержимое 2-й строки";
SaveToFile(fileReport);
finally
Free;
end;
Пользователь00005 ( 2007-09-03 10:27 ) [2]
var
someStringList : TStringList;
begin
someStringList := TStringList.Create;
someStringList.LoadFromFile(fileReport);
someStringList[] := "Новое содержимое n-й строки";
someStringList.SaveToFile(fileReport);
someStringList.Free;
end;
Denis_ © ( 2007-09-03 11:13 ) [3]
можно построчно читать, записывая в др. файл. нужную строку заменить.Файл1 удалить, Файл2 переименовать. так я делал на turbo pascal 7
← →DiamondShark © ( 2007-09-03 14:29 ) [4]
> Сергей М. © (03.09.07 10:24) [1]
> Пользователь00005 (03.09.07 10:27) [2]
чтоб вам попался файл в 350 мегабайт.
Denis_ © ( 2007-09-03 14:38 ) [5]
> чтоб вам попался файл в 350 мегабайт.
текстовый?:D
Anatoly Podgoretsky © ( 2007-09-03 14:47 ) [6]
> Denis_ (03.09.2007 14:38:05) [5]
Тебя что то смущает?
← →mrBOFH ( 2007-09-07 15:40 ) [7]
Мне нужно изменить определенную строку в текстовом файле, только вот не пойму как это сделать! Как заполнить новый файл я знаю, как добавить в конец существующего тоже понятно:
Ответ:
никак, стандартные файловые системы не позволяют уменшить размер файла без перезаписи, можно обойтись без перезаписи только в двух случаях, если новая вторая строчка будет меньше или равна количеству символов старой.
тогда свой файл таким макаром
Var
FileNameRead : TextFile;// открываеш только для чтения
F : file of byte; //допускается FileName : File; при определенных директивах компиля
файло открывеш reset(f); //без параметров
Anatoly Podgoretsky © ( 2007-09-07 21:46 ) [10]
> Denis_ (07.09.2007 19:38:09) [9]
Логи прокси сервера, логи доступа к веб серверу и т.д.
Максимальный размер лога был 800 мб.
Dib@zol © ( 2007-09-07 21:51 ) [11]
И что же это за такие кристально чистые прокси сервера с ниразу не чищенными логами, посоветуйте ;)
← →grisme © ( 2007-09-08 04:28 ) [12]
> где такие файлы(350 мб) открываются?
тоталовский ЛистВьюер открывает файлы любого размера - он считывает их по небольшим кусочкам. HIEW так же, вроде бы, делает. Ну уйма еще примеров.
← →Anatoly Podgoretsky © ( 2007-09-08 13:20 ) [13]
> И что же это за такие кристально чистые прокси сервера с
> ниразу не чищенными логами, посоветуйте ;)
Не тупи и не коси под дурачка.
Исходные коды не помешали бы.
Зарнее Вам благодарен.
← →ssk © ( 2004-07-08 16:43 ) [1]
Memo1.Text:=StringReplace(Memo1.Text, "Delphi", "Borland", [rfReplaceAll]);
← →MBo © ( 2004-07-08 16:44 ) [2]
найти - Pos
заменить - StringReplace или Delete/Insert
Helper ( 2004-07-08 16:57 ) [3]
Memo1.Text:=StringReplace(Memo1.Text, "Delphi", "Borland", [rfReplaceAll]);
Этот код немного не подходит, но всё равно спасибо.
Обьясню почему:
У меня есть заготовка в текстовом файле, она имеет много строк и букв, где - то в середине находится то слово которое мне надо заменить, приведённый выше пример заменяет всё полностью, а мне надо только то слово.
ssk © ( 2004-07-08 16:59 ) [4]
и как по Вашему можно определить именно то слово, если их в тексте, допустим, 20?
← →Zhekson ( 2004-07-08 17:08 ) [5]
Memo1.Text:=StringReplace(Memo1.Text, " Delphi ", " Borland ", [rfReplaceAll]); - попробуй так.
← →Helper ( 2004-07-08 17:18 ) [6]
"и как по Вашему можно определить именно то слово, если их в тексте, допустим, 20?"
Нет оно там точно 1, больше не должно быть
"Memo1.Text:=StringReplace(Memo1.Text, " Delphi ", " Borland ", [rfReplaceAll]); - попробуй так."
Выше написал, что так не получается :(.
← →ssk © ( 2004-07-08 17:26 ) [7]
напиши сюда свою строку
← →Helper ( 2004-07-08 17:33 ) [8]
напрмер мне надо найти вот такую строку :
Операционная система : [$Os ]
Надо в файле найти вот это - $Os и заменить например на Windows XP, в файле оно встречается 1 раз.
← →Zhekson ( 2004-07-08 17:36 ) [9]
я имел в виду, попробуй пробелы до и после своих слов поставить.
← →Zhekson ( 2004-07-08 17:42 ) [10]
Ну в любом случае Вы ищете кусок строки, которая идентифицирует искомую вами комбинацию. Вот её и вставьте в: "
Memo1.Text:=StringReplace(Memo1.Text, ". ", " Borland ", [rfReplaceAll]); "
ssk © ( 2004-07-08 17:44 ) [11]
честно говоря, не вижу никакой проблемы. сделал пример, где есть твоя строка:
← →Mim1 © ( 2004-07-08 18:59 ) [15]
В принципе те задачи котрые нельзя описать словами не решаемы.
← →ssk © ( 2004-07-08 19:03 ) [16]
посмотрел я исходник. все решается в 4 строки, если я правильно понял автора вопроса.
← →Helper ( 2004-07-08 19:08 ) [17]
ssk Спасибо огромное помогло, и всем кто отвечал также спасибо
ssk вот ещё маленький вопросец, а как сделать так чтоб после того текста который я вставил, эта рамка не перемещалась в сторону, что б рамка была фиксирована.
← →Helper ( 2004-07-08 20:38 ) [18]
ssk ты знаеш как это реализовать ,помоги пожалуйста
← →Андрей Пл ( 2007-09-03 10:15 ) [0]
Мне нужно изменить определенную строку в текстовом файле, только вот не пойму как это сделать! Как заполнить новый файл я знаю, как добавить в конец существующего тоже понятно:
assignFile(varFile, fileReport);
if not FileExists(fileReport) then
rewrite(varFile)
else
Append(varFile);
. . . . . . . . .
Writeln(varFile, str);
А как изменить в существующем файле например вторую строку.
Заранее спасибо.
Сергей М. © ( 2007-09-03 10:24 ) [1]
Для сравнительно небольшого файла:
with TStringList.Create;
try
LoadFromFile(fileReport);
Strings[1] := "Новое содержимое 2-й строки";
SaveToFile(fileReport);
finally
Free;
end;
Пользователь00005 ( 2007-09-03 10:27 ) [2]
var
someStringList : TStringList;
begin
someStringList := TStringList.Create;
someStringList.LoadFromFile(fileReport);
someStringList[] := "Новое содержимое n-й строки";
someStringList.SaveToFile(fileReport);
someStringList.Free;
end;
Denis_ © ( 2007-09-03 11:13 ) [3]
можно построчно читать, записывая в др. файл. нужную строку заменить.Файл1 удалить, Файл2 переименовать. так я делал на turbo pascal 7
← →DiamondShark © ( 2007-09-03 14:29 ) [4]
> Сергей М. © (03.09.07 10:24) [1]
> Пользователь00005 (03.09.07 10:27) [2]
чтоб вам попался файл в 350 мегабайт.
Denis_ © ( 2007-09-03 14:38 ) [5]
> чтоб вам попался файл в 350 мегабайт.
текстовый?:D
Anatoly Podgoretsky © ( 2007-09-03 14:47 ) [6]
> Denis_ (03.09.2007 14:38:05) [5]
Тебя что то смущает?
← →mrBOFH ( 2007-09-07 15:40 ) [7]
Мне нужно изменить определенную строку в текстовом файле, только вот не пойму как это сделать! Как заполнить новый файл я знаю, как добавить в конец существующего тоже понятно:
Ответ:
никак, стандартные файловые системы не позволяют уменшить размер файла без перезаписи, можно обойтись без перезаписи только в двух случаях, если новая вторая строчка будет меньше или равна количеству символов старой.
тогда свой файл таким макаром
Var
FileNameRead : TextFile;// открываеш только для чтения
F : file of byte; //допускается FileName : File; при определенных директивах компиля
файло открывеш reset(f); //без параметров
Anatoly Podgoretsky © ( 2007-09-07 21:46 ) [10]
> Denis_ (07.09.2007 19:38:09) [9]
Логи прокси сервера, логи доступа к веб серверу и т.д.
Максимальный размер лога был 800 мб.
Dib@zol © ( 2007-09-07 21:51 ) [11]
И что же это за такие кристально чистые прокси сервера с ниразу не чищенными логами, посоветуйте ;)
← →grisme © ( 2007-09-08 04:28 ) [12]
> где такие файлы(350 мб) открываются?
тоталовский ЛистВьюер открывает файлы любого размера - он считывает их по небольшим кусочкам. HIEW так же, вроде бы, делает. Ну уйма еще примеров.
← →Anatoly Podgoretsky © ( 2007-09-08 13:20 ) [13]
> И что же это за такие кристально чистые прокси сервера с
> ниразу не чищенными логами, посоветуйте ;)
Не тупи и не коси под дурачка.
Когда речь идет о работе программы с текстовым файлом, подразумеваются процедуры ввода данных из файла в программу или, наоборот, запись этих данных в файл программой. Для текстового файла допустима простая работа с файлом без особых дополнительных механизмов, которые применяются для работы со специализированными файлами, такими как при загрузке данных из Excel или работе программы с базой данных. Разумеется, Delphi располагает возможностями работать с файлами с использованием компонентов. Но в данной статье рассматривается механизм прямой работы с текстовым файлом без использования дополнительных компонентов.
Итак, в общем виде, работа с файлом заключается в следующих этапах:
1. подключение к файлу – связь с внешним файлом, указание режима подключения;
2. выполнение операций записи в файл или чтения из файла;
3. завершение работы с файлом.
Закрытие файла
По завершении работы с файлами, особенно в случае записи в них данных, необходимо корректно завершить работу с файловой переменной. Это делается для того, чтобы сохранить все внесенные в файл изменения.
Операции с файлами
Для чтения из файла, необходимо назначить режим чтения и использовать команду Readln(), которая будет вводить в строковую переменную по одной строке из файла. Затем с этой переменой можно выполнить необходимые действия.
Обычно для загрузки всех строк из файла используется оператор цикла. Для того, чтобы определить, что файл закончился используется функция EOF() (End Of File). Таким образом получается цикл, в котором последовательно в строковую переменную вводятся все строки файла и завершающийся после окончания фала:
Для записи, назначение режим записи в файл и командой Writeln() производится запись по строкам.
Подключение к файлу
Для связи программы с файлом используется специальная переменная – "Файловая переменная". Объявляется она так же как и любая переменная в Delphi. Тип это переменной может быть File для типизированных (хранящих данные определенного типа) файлов, а можно указать TextFile, что будет означать тип обычного текстового файла. Объявление переменной:
В исполняемом коде программы выполняется подключение к внешнему файлу:
Команда AssignFile, выполняет связь файловой переменной с внешним файлом. Вторым параметром указывается адрес файла. Он может быть задан относительным или абсолютным. Если указать только имя файла, то программа будет пытаться обнаружить его в той же директории, где она сама и находится. Абсолютный путь указывается от корневого диска:
Использование относительной директории дает возможность не привязываться к конкретным дискам и адресам. Например:
После того как выполнено подключение, выполняется процедура, устанавливающая режим работы с файлом. В основном это режим чтения или записи. Эти режимы назначаются процедурами Reset() ( для чтения) и rewrite() (для записи):
* Для команды Rewrite() следует учитывать, что при ее выполнении, она либо создает файл, указанный в файловой переменной, либо если он уже есть перезаписывает файл заново, удаляя старый без какого-то предупреждения.
Любую из указанных команд можно использовать без команды AssignFile(). Для этого достаточно вторым параметром указать путь к файлу. Таким образом, она сразу выполнит привязку файла к файловой переменной и назначит режим работы с этим файлом:
Примеры работы с текстовыми файлами в Delphi
Чтение в переменную одного значения из файла:
Загрузить все строки файла в компонент Memo:
Следует отметить, что для этой задачи проще воспользоваться командой самого компонента Memo LoadFromFile().
Записать строку в файл:
Записать в текстовый файл все строки из компонента Memo:
Как и для чтения из файла в Memo, так и здесь, имеется специальная команда:
Читайте также: