Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.11.2014, 00:28
Alexander_UA Alexander_UA вне форума
Прохожий
 
Регистрация: 23.11.2014
Сообщения: 8
Версия Delphi: Delphi
Репутация: 10
Восклицание Програма по замене одно-трех значных чисел в тексте

Исходное задание намного больше и сложнее, но я опишу здесь то, с чем не могу справится сам:
Есть текстовый файл (тхт) в котором дан большой (многострочный) текст. Найти в нем числа меньше заданного числа N и отнять от них единицу. Записать измененных текст в Мемо.
Теперь конкретней - число N задается в рамках от 1 до 500(!), то есть нужно учесть одно- двух- и трех- значные числа в программе.
Может кто подскажет рациональный способ, без десятиэтажных конструкций???
Ответить с цитированием
  #2  
Старый 23.11.2014, 01:38
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Простейший вариант: Разобрать весь текст на отдельные слова с помощью класса StringList. Пробежаться по полученному массиву сделав замену согласно вашему условию. Сохранить измененный текст в Мемо.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 23.11.2014, 10:32
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Страдалецъ
Простейший вариант:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
 sl: TStrings;
 i, N: integer;
 b: extended;
begin
 Memo1.Clear;
 N:= 500;
 sl:= TStringList.Create;
 sl.LoadFromFile('Текст.txt');
 sl.DelimitedText:= sl.Text;
 for i := 0 to sl.Count-1 do
  if TryStrToFloat(sl[i], b) then 
   if b < N then Memo1.Lines.Add(FloatToStr(b-1))
    else Memo1.Lines.Add(FloatToStr(b))
     else Memo1.Lines.Add(sl[i]);
sl.Free;
end;

Последний раз редактировалось Alegun, 23.11.2014 в 10:52.
Ответить с цитированием
  #4  
Старый 23.11.2014, 11:33
Alexander_UA Alexander_UA вне форума
Прохожий
 
Регистрация: 23.11.2014
Сообщения: 8
Версия Delphi: Delphi
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Разобрать весь текст на отдельные слова
Ну хорошо, а если эти числа стоят не просто так в тексте, а в скобках и вместе с точкой-запятой? Например [52, c.34-78; 137, c.56-98]. (тут соответственно нужно редактировать числа 52 и 137)
Ответить с цитированием
  #5  
Старый 23.11.2014, 12:06
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Alexander_UA
Ну хорошо, а если эти числа стоят не просто так в тексте, а в скобках и вместе с точкой-запятой?...
Ну тогда вам одна дорога - шерстить весь текст на наличие символов в диапазоне in [0..9], складывать их в отдельную переменную до любого разделителя и конвертить стандартными средствами в integer с последующей инкрементацией... Хотите конкретики: как говорится, образец текстового файла - в студию!
Ответить с цитированием
  #6  
Старый 23.11.2014, 12:20
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Кто мешает загнать ранее предложенное решение в цикл и использовать разные разделители?
Код:
procedure TForm28.Button1Click(Sender: TObject);
var
 sl: TStrings;
 i, N: integer;
 b: extended;
  j: Integer;
const
 CharList: String[2] = '[],';
begin
 Memo1.Clear;
 N:= 500;
 sl:= TStringList.Create;
 sl.Text := '[52, c.34-78; 137, c.56-98]';
 for j := 1 to Length(CharList)
 do begin
    sl.Delimiter := Char(CharList[j]);
    sl.DelimitedText:= sl.Text;
    end;
 for i := 0 to sl.Count-1
 do if TryStrToFloat(sl[i], b)
    then if b < N
         then Memo1.Lines.Add(FloatToStr(b-1))
         else Memo1.Lines.Add(FloatToStr(b))
    else Memo1.Lines.Add(sl[i]);
 sl.Free;
end;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #7  
Старый 23.11.2014, 12:36
Alexander_UA Alexander_UA вне форума
Прохожий
 
Регистрация: 23.11.2014
Сообщения: 8
Версия Delphi: Delphi
Репутация: 10
Стрелка

Вот пример текста и полная постановка задачи:
З.Ы. в примере красным выделенные специально допущенные ошибки (да-да, их тоже нужно учесть )
Вложения
Тип файла: doc Документ_Microsoft_Word.doc (28.0 Кбайт, 6 просмотров)
Тип файла: doc ПРОГРАММА.doc (32.0 Кбайт, 6 просмотров)
Ответить с цитированием
  #8  
Старый 23.11.2014, 14:38
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Тут уже должен быть ответ "Используй RegExp".
А без них - что-то вроде этого:
Код:
n := 500;
i := 1;
s1 := '';
sresult := '';
while i <= length(s) do
begin
  if s[i] in ['0'..'9'] then
    s1 := s1 + s[i]
  else
  begin
   if s1 <> '' then
   begin
     // тут s1 содержит очередное число
     num := StrToInt(s1);
     if num < n then
        sresult := sresult + IntToStr(num - 1)
     else
        sresult := sresult + s1;
     s1 := '';
   end;
   sresult := sresult + s[i];
  end;
  inc(i);
end;
// крайний случай (число в конце текста)
if s1 <> '' then
begin
  num := StrToInt(s1);
  if num < n then
     sresult := sresult + IntToStr(num - 1)
  else
     sresult := sresult + s1;
end;
writeln(sresult);
readln;
Для заданного примера '[52, c.34-78; 137, c.56-98]' выход [51, c.33-77; 137, c.55-97] при N = 100.

Можно модифицировать, чтобы не по одному символу в строку прибавлять, а блоками.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 23.11.2014 в 14:43.
Ответить с цитированием
  #9  
Старый 23.11.2014, 16:00
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Да ужж... И чего бы вам сразу не предоставить текст задания. Все несколько иначе надо делать.
1. Поскольку в качестве исходного текста задается файл ворда, то и использовать надо соответствующие компоненты.
Код:
Var
  WordApp: OLEVariant;
...
WordApp := CreateOleObject('Word.Application');
WordApp.Documents.Open('Документ_Microsoft_Word.doc', ReadOnly := True);

2. Поиск текста по шаблону можно и нужно реализовать средствами ворд.
...
Код:
WordApp.Selection.Find.ClearFormatting;
WordApp.Selection.Find.Text := '\[[0-9]@';
WordApp.Selection.Find.MatchWildcards := True;
WordApp.Selection.Find.Forward := True;
WordApp.Selection.Find.Execute;

Результат поиска по шаблону в ворде будет лежать в WordApp.Selection.Text

Вот примерно таким путем мне кажется идти надо
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #10  
Старый 23.11.2014, 16:43
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Есть текстовый файл (тхт)
Цитата:
имя текстового файла Word
Да уж, согласен со Страдальцемъ. Не мешало бы определиться.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #11  
Старый 23.11.2014, 20:29
Alexander_UA Alexander_UA вне форума
Прохожий
 
Регистрация: 23.11.2014
Сообщения: 8
Версия Delphi: Delphi
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
Для заданного примера '[52, c.34-78; 137, c.56-98]' выход [51, c.33-77; 137, c.55-97] при N = 100.
Так не пойдет, нужно чтоб страницы не трогало, а редактировало только числа 52 и 137.
Страдалецъ, можно по подробнее про WordApp? Вы описали как задать поиск и ввести туда результат, а как редактировать заданый текст и сохранить обратно?
Прошу прощения что такой нубь, вот только не давно начал изучать Делфи
Ответить с цитированием
  #12  
Старый 24.11.2014, 08:36
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Господа, а почему бы Оракл сюда не прикрутить? Простые регулярки решают поиск.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #13  
Старый 24.11.2014, 19:41
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Цитата:
Господа, а почему бы Оракл сюда не прикрутить? Простые регулярки решают поиск.
Регулярки в чем? В вордовском документе? Даже если найдете, как править собираетесь?
Может я чего не знаю, готов к восприятию!
ПС: Я именно регулярку и предложил в примере, но в формате ворда.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #14  
Старый 24.11.2014, 22:50
Alexander_UA Alexander_UA вне форума
Прохожий
 
Регистрация: 23.11.2014
Сообщения: 8
Версия Delphi: Delphi
Репутация: 10
По умолчанию

Слышал что в делфи с Вордовскими документами можно работать через ОлеКонтейнер, как его реализовать?
З.Ы. Наведенные выше коды для тхт файлов работают не совсем корректно (не выполняют поставленную задачу, или выполняют но не так)
Ответить с цитированием
  #15  
Старый 25.11.2014, 08:03
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Страдалецъ
Регулярки в чем? В вордовском документе? Даже если найдете, как править собираетесь?
Может я чего не знаю, готов к восприятию!
ПС: Я именно регулярку и предложил в примере, но в формате ворда.

Цитата:
Есть текстовый файл (тхт) в котором дан большой (многострочный) текст. Найти в нем числа меньше заданного числа N и отнять от них единицу. Записать измененных текст в Мемо.

В исходной задаче не было вордовского документа. Если ТС не может нормально поставить задачу - я не при чем.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
Этот пользователь сказал Спасибо Aristarh Dark за это полезное сообщение:
M.A.D.M.A.N. (25.11.2014)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:16.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025