![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Исходное задание намного больше и сложнее, но я опишу здесь то, с чем не могу справится сам:
Есть текстовый файл (тхт) в котором дан большой (многострочный) текст. Найти в нем числа меньше заданного числа N и отнять от них единицу. Записать измененных текст в Мемо. Теперь конкретней - число N задается в рамках от 1 до 500(!), то есть нужно учесть одно- двух- и трех- значные числа в программе. Может кто подскажет рациональный способ, без десятиэтажных конструкций??? |
|
#2
|
||||
|
||||
|
Простейший вариант: Разобрать весь текст на отдельные слова с помощью класса StringList. Пробежаться по полученному массиву сделав замену согласно вашему условию. Сохранить измененный текст в Мемо.
|
|
#3
|
||||
|
||||
|
Цитата:
Код:
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
|
|||
|
|||
|
Цитата:
|
|
#5
|
||||
|
||||
|
Цитата:
|
|
#6
|
||||
|
||||
|
Кто мешает загнать ранее предложенное решение в цикл и использовать разные разделители?
Код:
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
|
|||
|
|||
|
Вот пример текста и полная постановка задачи:
З.Ы. в примере красным выделенные специально допущенные ошибки (да-да, их тоже нужно учесть ) |
|
#8
|
||||
|
||||
|
Тут уже должен быть ответ "Используй 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;Можно модифицировать, чтобы не по одному символу в строку прибавлять, а блоками. Последний раз редактировалось Bargest, 23.11.2014 в 14:43. |
|
#9
|
||||
|
||||
|
Да ужж... И чего бы вам сразу не предоставить текст задания. Все несколько иначе надо делать.
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
|
||||
|
||||
|
Цитата:
Цитата:
|
|
#11
|
|||
|
|||
|
Цитата:
Страдалецъ, можно по подробнее про WordApp? Вы описали как задать поиск и ввести туда результат, а как редактировать заданый текст и сохранить обратно? Прошу прощения что такой нубь, вот только не давно начал изучать Делфи ![]() |
|
#12
|
||||
|
||||
|
Господа, а почему бы Оракл сюда не прикрутить? Простые регулярки решают поиск.
|
|
#13
|
||||
|
||||
|
Цитата:
Может я чего не знаю, готов к восприятию! ![]() ПС: Я именно регулярку и предложил в примере, но в формате ворда. |
|
#14
|
|||
|
|||
|
Слышал что в делфи с Вордовскими документами можно работать через ОлеКонтейнер, как его реализовать?
З.Ы. Наведенные выше коды для тхт файлов работают не совсем корректно (не выполняют поставленную задачу, или выполняют но не так) |
|
#15
|
||||
|
||||
|
Цитата:
Цитата:
В исходной задаче не было вордовского документа. Если ТС не может нормально поставить задачу - я не при чем. |
| Этот пользователь сказал Спасибо Aristarh Dark за это полезное сообщение: | ||
M.A.D.M.A.N. (25.11.2014)
| ||