Фильтрация строк

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Фильтрация строк

Сообщение nagash » 17.12.2008 09:59:52

Дан входной тесктовый файл, нужно из него выбрать строки, содержащие нужное слово или словосочетание и записать их в другой файл.

Написал функцию, возвращающую true, если данное слово или словосочетание в строке присутствует, но видно где-то накосячил, оно всегда выдает false. Не могу отследить где, кто может помочь или посоветовать как подобное сделать проще?

Код: Выделить всё
function parse(curstr:string; x:string):boolean;
var
  valstr,
  valx,
  i,
  j,
  k:integer;
begin
  valstr := length(curstr);
  valx := length(x);
  i := 1;
  j := 1;
  repeat begin
    if curstr[i] = x[j] then begin
      k := i;
      if curstr[k + 1] = x[j + 1] then begin
        inc(k);
        repeat begin
          if curstr[k] = x[j] then parse := true else parse := false;
          inc(j);
        end;
        until j=valx;
      j := 1;
      end;
    end;
    inc(i);
  end;
  until i=valstr;
end;
nagash
новенький
 
Сообщения: 50
Зарегистрирован: 21.05.2007 08:27:05

Re: Фильтрация строк

Сообщение v-t-l » 17.12.2008 11:13:14

А функция pos не подходит?.
v-t-l
энтузиаст
 
Сообщения: 740
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: Фильтрация строк

Сообщение nagash » 17.12.2008 11:52:04

точно... забыл про нее
спасибо огромное :)

Добавлено спустя 22 часа 4 минуты 41 секунду:
пишу тут же, потому что это по сути продолжение
поиск работает, теперь мне нужно сделать его регистронезависимым с поддержкой русского

написал вот что:
Код: Выделить всё
 
for i := 1 to length(curstr) do begin
    case curstr[i] of
    'а': curstr[i]:= 'А';
    'б': curstr[i]:= 'Б';
...
    'ю': curstr[i]:= 'Ю';
    'я': curstr[i]:= 'Я';
    else curstr[i] := upcase(curstr[i]);
  end;


начало ругаться вот так - Error: Illegal assignment to for-loop variable ”i”
порылся в инете, прочел, что "You cannot assign values to loop variables inside the loop"
подумал, что может компилятор обижается на то, что я использую i в самом цикле... тогда сделал следующим образом:

Код: Выделить всё
  k := 1;
  for i := 1 to length(curstr) do begin
    case curstr[k] of
    'а': curstr[k]:= 'А';
    'б': curstr[k]:= 'Б';
...
    'ю': curstr[k]:= 'Ю';
    'я': curstr[k]:= 'Я';
    else curstr[k] := upcase(curstr[k]);
    inc(k);
  end;


все заработало нормально
пишу такое же для другой переменной

Код: Выделить всё
  k := 1;
  for i := 1 to length(x) do begin
    case x[k] of
    'а': x[k]:= 'А';
    'б': x[k]:= 'Б';
...
    'ю': x[k]:= 'Ю';
    'я': x[k]:= 'Я';
    else x[k] := upcase(x[k]);
    inc(k);
  end;


и снова получаю Error: Illegal assignment to for-loop variable ”i”


Я чего-то не понимаю или эта ошибка возникает от положения звезд на небе? :)

Добавлено спустя 58 минут 38 секунд:
извиняюсь, разобрался сам

такая ошибка выводится если пропущен end в конструкции case ... of ... end;
правда логики я все равно не вижу, ну да и черт с ним
nagash
новенький
 
Сообщения: 50
Зарегистрирован: 21.05.2007 08:27:05

Re: Фильтрация строк

Сообщение B4rr4cuda » 18.12.2008 15:11:31

ммм, а зачем каждый символ заменять? Чем не подходят функции
Код: Выделить всё
UpperCase();
AnsiUpperCase();
Аватара пользователя
B4rr4cuda
энтузиаст
 
Сообщения: 693
Зарегистрирован: 28.12.2007 07:48:35

Re: Фильтрация строк

Сообщение nagash » 19.12.2008 08:49:57

B4rr4cuda писал(а):ммм, а зачем каждый символ заменять? Чем не подходят функции
Код: Выделить всё
UpperCase();
AnsiUpperCase();

хм... а в них есть поддержка кириллицы?
nagash
новенький
 
Сообщения: 50
Зарегистрирован: 21.05.2007 08:27:05

Re: Фильтрация строк

Сообщение Mr.Smart » 19.12.2008 13:24:35

В AnsiUpperCase усть
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Фильтрация строк

Сообщение nagash » 17.04.2009 16:39:58

В принципе в эту же тему.
Ассемблер я не знаю, но надо скомпилить вот это:

Код: Выделить всё
{$ASMMODE INTEL}
unit cases;
interface

Function  UpCaseChar(C:Char):Char;
Procedure UpCaseStr(var S:String);

implementation
Function  UpCaseChar(C:Char):Char;assembler;
asm
  mov al,C
  cmp al,$61
  jb @Exit
  cmp al,$7b
  jb @Up20
  cmp al,$a0
  jb @Exit
  cmp al,$b0
  jb @Up20
  cmp al,$e0
  jb @Exit
  cmp al,$ef
  ja @Exit
  sub al,$50
  jmp @Exit
@Up20:
  sub al,$20
@Exit:
end;


Procedure UpCaseStr(var S:String);assembler;
asm
  cld
  les di,S
  mov al,byte ptr es:[di]
  cmp al,0
  je @Exit
  mov cl,al
  mov ch,0
  inc di
@Loop:
  mov al,byte ptr es:[di]
  push ax
  Call far ptr UpCaseChar
  stosb
  loop @Loop
@Exit:
end;
end.


При компиляции:
(45,8) Warning: FAR ignored
(45,16) Error: Invalid operand type

может кто знающий подскажет?

45-я строка это
Код: Выделить всё
Call far ptr UpCaseChar
nagash
новенький
 
Сообщения: 50
Зарегистрирован: 21.05.2007 08:27:05

Re: Фильтрация строк

Сообщение Vadim » 17.04.2009 17:18:42

А чем Вам AnsiUpperCase() не подощло? Зачем Вам собственная функция?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Фильтрация строк

Сообщение nagash » 17.04.2009 17:25:33

Да это уже не из той оперы, это я пытаюсь скомпилить одну бухгалтерскую программку :)
Вот и ругается...
Конечно, если никто не подскажет насчет этой ошибки, то я наверное перепишу этот UpCaseStr с использованием AnsiUpperCase
nagash
новенький
 
Сообщения: 50
Зарегистрирован: 21.05.2007 08:27:05

Re: Фильтрация строк

Сообщение Sergei I. Gorelkin » 17.04.2009 18:56:10

nagash писал(а):Конечно, если никто не подскажет насчет этой ошибки, то я наверное перепишу этот UpCaseStr с использованием AnsiUpperCase

Подсказать - подскажем, только легче вряд ли станет.
Это 16-битный код, который в 32-битном FPC не пройдет просто никак. Если far ptr можно просто убрать, то всякие es:[di] уже просто так не уберешь.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Фильтрация строк

Сообщение nagash » 17.04.2009 19:44:53

спасибо, тогда перепишу :)
nagash
новенький
 
Сообщения: 50
Зарегистрирован: 21.05.2007 08:27:05

Re: Фильтрация строк

Сообщение VirtUX » 01.07.2009 19:11:37

У меня AnsiUpperCase не преобразовывает русские символы в верхний регистр :(
Lazarus 0.9.27 SVN QT, делаю под ним консольное приложение.
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Фильтрация строк

Сообщение VirtUX » 05.07.2009 20:13:55

Подскажите работающий вариант преобразования русских символов в верхний регистр и обратно. Строка - UTF8String.
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Фильтрация строк

Сообщение Mr.Smart » 05.07.2009 21:30:33

Так ведь AnsiUpperCase работает с Ansi строками и применение её для UTF8 негодится!
поробуйте вот так:
Код: Выделить всё
  UTF8Encode(WideUpperCase(UTF8Decode(str)));
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Фильтрация строк

Сообщение Vadim » 06.07.2009 07:17:04

VirtUX
С UTF8 надо вот енту штукенцию - function UTF8UpperCase(const s: String): String; из lclprocs.pas.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15

Рейтинг@Mail.ru