Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 14.07.2012
Сообщений: 53
1

Строка: Как реализовать функцию поиска и замены текста в файле?

25.03.2016, 18:47. Показов 965. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Подскажите, как реализовать функцию поиска и замены текста в файле. Есть файл 1.txt и в нем какой-то текст. Есть файл 2.txt с выражениями
$Привет Андрей$ = $1 Здравствуй Максим $1
$Пока Андрей$ = $1 До свидания Максим $1
и т.д.
То что написано внутри $..$ нужно заменить на текст внутри $1..$1 в тексте файла 1.txt. Как такое сделать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.03.2016, 18:47
Ответы с готовыми решениями:

Скрипт поиска и замены текста в файле
Всем привет! Помогите пожалуйста написать простой скрипт по поиску и замены текста в файле. Есть...

Как написать функцию замены текста?
например входной параметр автоматом был снят пробел нужно заменить на автоматически был снят...

Как отключить функцию замены символа при выделении текста?
Ужасно бесит эта тема, которая появилась у меня CC 2017 - всплывающее окно при наведении на символ,...

Как реализовать функцию поиска по БД через TextBox
Доброго дня! Подскажите как реализовать функцию поиска по бд через TextBox. Т.е. чтобы при наборе...

15
3587 / 2196 / 693
Регистрация: 29.05.2013
Сообщений: 9,381
25.03.2016, 19:10 2
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Var
  F1,F2: TStringList;
  i: Integer;
  FindValue,ReplaceValue: String;
begin
 F1 := TStringList.Create;
 F1.LoadFromFile('c:\F1.txt');
 F2 := TStringList.Create;
 F2.LoadFromFile('c:\F2.txt');
 for i := 0 to F2.Count - 1
 do begin
    FindValue := StringReplace(Copy(F2.Strings[i], 1, Pos('=', F2.Strings[i]) - 2), '$', '', [rfReplaceAll]);
    ReplaceValue := StringReplace(Copy(F2.Strings[i], Pos('=', F2.Strings[i]) + 2, Length(F2.Strings[i])), '$1', '', [rfReplaceAll]);
    F1.Text := StringReplace(F1.Text, FindValue, ReplaceValue, [rfReplaceAll]);
    end;
 F1.SaveToFile('c:\F1.txt');
 F2.Free;
 F1.Free;
end;
1
1 / 1 / 0
Регистрация: 14.07.2012
Сообщений: 53
27.03.2016, 17:34  [ТС] 3
Спасибо. Подскажите еще, как сделать замену текста в строках с переносом? Пример:
$Добро
пожаловать!$
на
$1Приветствуем
всех$1
Пробовал в текстовом документе сделать также, но там не читает две строки почему то
0
3587 / 2196 / 693
Регистрация: 29.05.2013
Сообщений: 9,381
27.03.2016, 18:23 4
Тут сложнее, слишком много вариантов возможно, но как частный случай можно немного изменить код:
Delphi
1
2
3
4
5
6
7
8
9
 for i := 0 to F2.Count - 1
 do begin
    FindValue := StringReplace(Copy(F2.Strings[i], 1, Pos('=', F2.Strings[i]) - 2), '$', '', [rfReplaceAll]);
    ReplaceValue := StringReplace(Copy(F2.Strings[i], Pos('=', F2.Strings[i]) + 2, Length(F2.Strings[i])), '$1', '', [rfReplaceAll]);
    F1.Text := StringReplace(F1.Text, FindValue, ReplaceValue, [rfReplaceAll]);
    FindValue := StringReplace(FindValue, ' ', #13#10, []);
    ReplaceValue := StringReplace(ReplaceValue, ' ', #13#10, []);
    F1.Text := StringReplace(F1.Text, FindValue, ReplaceValue, [rfReplaceAll]);
    end;
0
1 / 1 / 0
Регистрация: 14.07.2012
Сообщений: 53
27.03.2016, 19:54  [ТС] 5
Меняется только первая строка, а вторая становится пустой.
0
3587 / 2196 / 693
Регистрация: 29.05.2013
Сообщений: 9,381
27.03.2016, 19:58 6
Дайте примерчик ваших текстов, без них трудно предложить верное решение.
0
1 / 1 / 0
Регистрация: 14.07.2012
Сообщений: 53
27.03.2016, 20:07  [ТС] 7
Пока что на этих файлах проверяю.
Вложения
Тип файла: zip Архив ZIP - WinRAR.zip (423 байт, 5 просмотров)
0
1 / 1 / 0
Регистрация: 14.07.2012
Сообщений: 53
27.03.2016, 20:21  [ТС] 8
Еще пытаюсь сделать выбор файла по кнопке для замены:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
procedure TForm1.Button1Click(Sender: TObject);
Var
  F1,F2: TStringList;
  i: Integer;
  FindValue,ReplaceValue: String;
begin
 //F1 := TStringList.Create;
 //F1.LoadFromFile('data\test.txt');
 F2 := TStringList.Create;
 F2.LoadFromFile('text.txt');
 for i := 0 to F2.Count - 1
 do begin
    FindValue := StringReplace(Copy(F2.Strings[i], 1, Pos('=', F2.Strings[i]) - 2), '$', '', [rfReplaceAll]);
    ReplaceValue := StringReplace(Copy(F2.Strings[i], Pos('=', F2.Strings[i]) + 2, Length(F2.Strings[i])), '$1', '', [rfReplaceAll]);
    F1.Text := StringReplace(F1.Text, FindValue, ReplaceValue, [rfReplaceAll]);
    FindValue := StringReplace(FindValue, ' ', #13#10, []);
    ReplaceValue := StringReplace(ReplaceValue, ' ', #13#10, []);
    F1.Text := StringReplace(F1.Text, FindValue, ReplaceValue, [rfReplaceAll]);
    end;
 F1.SaveToFile('test_new.txt');
 F2.Free;
 F1.Free;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var F1: TStringList;
begin
if OpenDialog1.Execute then
      F1 := TStringList.Create;
      F1.LoadFromFile(OpenDialog1.FileName);
end;
Файл выбирается, но при нажатии на кнопку выполнения появляется ошибка на 15 строчку.
0
3587 / 2196 / 693
Регистрация: 29.05.2013
Сообщений: 9,381
27.03.2016, 20:23 9
Какой хитрый человек, а про то что у вас файл с заменами содержит пустые строки между заменами - скромно умолчали?
0
1 / 1 / 0
Регистрация: 14.07.2012
Сообщений: 53
27.03.2016, 20:27  [ТС] 10
Не знал, что это повлияет на работу. Сейчас убрал пустые строки в файле замены и результат такой же.
0
3587 / 2196 / 693
Регистрация: 29.05.2013
Сообщений: 9,381
27.03.2016, 21:00 11
Нет, все не так просто, стринглист считает каждую строку за элемент массива. У вас файл замен сделан иначе, с ним надо немного по другому работать. Можно сделать несколько иначе, вместо переноса там использовать специальные символы, которые будут обозначать перенос. А уже в коде программы обрабатывать их как переносы.
Допустим комбинация #@# будет считаться переносом, тогда код замены вместо пробелов будет такой:
Delphi
1
2
FindValue := StringReplace(FindValue, '#@#', #13#10, []);
ReplaceValue := StringReplace(ReplaceValue, '#@#', #13#10, []);
и файл Text.txt будет уже такой:
$Привет Андрей$ = $1Здравствуй Максим$1
$Пока Андрей$ = $1До свидания Максим$1
$Добро#@#пожаловать$ = $1Приветствуем#@#всех$1

Попробуйте, вроде должно сработать
1
1 / 1 / 0
Регистрация: 14.07.2012
Сообщений: 53
27.03.2016, 21:16  [ТС] 12
Спасибо, так действительно работает. Остался вопрос с выбором файла через диалог.
0
1 / 1 / 0
Регистрация: 14.07.2012
Сообщений: 53
11.04.2016, 17:30  [ТС] 13
Подскажите пожалуйста, как выбрать файл для замены текста через диалоговое окно. Делаю так, но сохраняется пустой файл в итоге. Не знаю как правильно передать значение из второй кнопки на первую.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
var
  Form1: TForm1;
  F1: TStringList;
  fFilePath: string = '';
 
implementation
 
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
begin
if OpenDialog1.Execute then
      F1 := TStringList.Create;
      F1.LoadFromFile(OpenDialog1.FileName);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
Var
  F2: TStringList;
  i: Integer;
  FindValue,ReplaceValue: String;
begin
 F1:= TStringList.Create;
 F2 := TStringList.Create;
 F2.LoadFromFile('text.txt');
 for i := 0 to F2.Count - 1
 do begin
    FindValue := StringReplace(Copy(F2.Strings[i], 1, Pos('=', F2.Strings[i]) - 2), '$', '', [rfReplaceAll]);
    ReplaceValue := StringReplace(Copy(F2.Strings[i], Pos('=', F2.Strings[i]) + 2, Length(F2.Strings[i])), '$1', '', [rfReplaceAll]);
    F1.Text := StringReplace(F1.Text, FindValue, ReplaceValue, [rfReplaceAll]);
    FindValue := StringReplace(FindValue, '#@#', #13#10, []);
    ReplaceValue := StringReplace(ReplaceValue, '#@#', #13#10, []);
    F1.Text := StringReplace(F1.Text, FindValue, ReplaceValue, [rfReplaceAll]);
    end;
 F1.SaveToFile('test_new.txt');
 F2.Free;
 F1.Free;
end;
0
3587 / 2196 / 693
Регистрация: 29.05.2013
Сообщений: 9,381
11.04.2016, 19:41 14
Delphi
1
2
3
4
5
6
procedure TForm1.Button2Click(Sender: TObject);
begin
if not OpenDialog1.Execute then Exit;
F1 := TStringList.Create;
F1.LoadFromFile(OpenDialog1.FileName);
end;
и из procedure TForm1.Button1Click(Sender: TObject); уберите строчку F1:= TStringList.Create;
1
1 / 1 / 0
Регистрация: 14.07.2012
Сообщений: 53
25.04.2016, 13:17  [ТС] 15
Как правильно сделать защиту от пустого выбора в этом коде?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
procedure TForm1.Button2Click(Sender: TObject);
//var F1: TStringList;
begin
if not OpenDialog1.Execute then Exit;
  F1 := TStringList.Create;
  F1.LoadFromFile(OpenDialog1.FileName);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
Var
  //F1,
  F2: TStringList;
  i: Integer;
  FindValue,ReplaceValue: String;
begin
 //F1:= TStringList.Create;
 //F1.LoadFromFile('data\test.txt');
 
if RadioGroup1.ItemIndex=0 then
begin
  F2 := TStringList.Create;
  F2.LoadFromFile('text.txt');
end
else if RadioGroup1.ItemIndex=1 then
begin
  F2 := TStringList.Create;
  F2.LoadFromFile('text2.txt');
end;
 //F2 := TStringList.Create;
 //F2.LoadFromFile('text.txt');
for i := 0 to F2.Count - 1
  do begin
  FindValue := StringReplace(Copy(F2.Strings[i], 1, Pos('=', F2.Strings[i]) - 2), '$', '', [rfReplaceAll]);
  ReplaceValue := StringReplace(Copy(F2.Strings[i], Pos('=', F2.Strings[i]) + 2, Length(F2.Strings[i])), '$1', '', [rfReplaceAll]);
  F1.Text := StringReplace(F1.Text, FindValue, ReplaceValue, [rfReplaceAll]);
  FindValue := StringReplace(FindValue, '#@#', #13#10, []);
  ReplaceValue := StringReplace(ReplaceValue, '#@#', #13#10, []);
  F1.Text := StringReplace(F1.Text, FindValue, ReplaceValue, [rfReplaceAll]);
end;
if RadioGroup1.ItemIndex=0 then
begin
  F1.SaveToFile(OpenDialog1.FileName+'test1_new.txt');
end
else if RadioGroup1.ItemIndex=1 then
begin
  F1.SaveToFile(OpenDialog1.FileName+'test2_new.txt');
end;
//F1.SaveToFile(OpenDialog1.FileName+'test_new.txt');
  F2.Free;
  F1.Free;
end;
Если файл не выбран, то при нажатии на Button1 выдает ошибку. Пытался сделать сравнение, если filename пусто, то выводить сообщение. Но все равно кидало ошибку.
0
3587 / 2196 / 693
Регистрация: 29.05.2013
Сообщений: 9,381
25.04.2016, 22:24 16
Delphi
1
2
3
F2.LoadFromFile('text.txt');
...
F2.LoadFromFile('text2.txt');
И вот в каком каталоге располагаются эти файлы? Без задания пути к ним, вы рискуете получить непредсказуемую работу приложения, что похоже и случается.
Далее, это что за странная штука?
Delphi
1
F1.SaveToFile(OpenDialog1.FileName+'test1_new.txt');
OpenDialog1.FileName содержит еще и расширение. Т.е. у вас выйдет:
c:\1\test.txttest1_new.txt
Явно не то что вы ожидаете увидеть.
Вообще откройте для себя отладчик в дельфи, 90% вопросов исчезнут на этапе отладки приложения.
0
25.04.2016, 22:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.04.2016, 22:24
Помогаю со студенческими работами здесь

Реализация поиска и замены текста
Использую компонент TRichEdit, для поиска и замены использую TFindDialog, TReplaceDialog. Нашла...

Окно поиска замены текста
Подскажите где и как в VS C++ можно найти окно поиска замены текста в richtextbox как в обычном...

Составить программу для поиска и замены символов в файле
Найти в файле F все слова из одной буквы и лишние пробелы между словами (пробел должен быть 1), и,...

Интерфейс поиска и замены текста в richTextBox
Добрый день! Преподаватель дал задание с помощью текстбокса сделать аналог блокнота с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru