![]() |
|
|
Регистрация | << Правила форума >> | 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; Можно модифицировать, чтобы не по одному символу в строку прибавлять, а блоками. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось 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
|
||||
|
||||
![]() Цитата:
Цитата:
jmp $ ; Happy End! The Cake Is A Lie. |
#11
|
|||
|
|||
![]() Цитата:
Страдалецъ, можно по подробнее про WordApp? Вы описали как задать поиск и ввести туда результат, а как редактировать заданый текст и сохранить обратно? Прошу прощения что такой нубь, вот только не давно начал изучать Делфи ![]() |
#12
|
||||
|
||||
![]() Господа, а почему бы Оракл сюда не прикрутить? Простые регулярки решают поиск.
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#13
|
||||
|
||||
![]() Цитата:
Может я чего не знаю, готов к восприятию! ![]() ПС: Я именно регулярку и предложил в примере, но в формате ворда. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#14
|
|||
|
|||
![]() Слышал что в делфи с Вордовскими документами можно работать через ОлеКонтейнер, как его реализовать?
З.Ы. Наведенные выше коды для тхт файлов работают не совсем корректно (не выполняют поставленную задачу, или выполняют но не так) |
#15
|
||||
|
||||
![]() Цитата:
Цитата:
В исходной задаче не было вордовского документа. Если ТС не может нормально поставить задачу - я не при чем. Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
Этот пользователь сказал Спасибо Aristarh Dark за это полезное сообщение: | ||
M.A.D.M.A.N. (25.11.2014)
|