Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.03.2011, 11:57   #1
SergiOD
 
Регистрация: 11.12.2010
Сообщений: 8
По умолчанию сверить TXT по шаблону

Здравствуйте!

Открываем TXT файл (AssignFile).
Файл имеет структуру типа:
строк может быть сколько угодно, но каждая строка должна иметь 5 знаков ; (semicolon) и в конце строки он стоит обязательно.
Код:
123; 4566; afds; 312; 53;
654; er; qw; ewrewreww; 5;
Помогите проверить условие:
Если хотя бы в одной строке (из возможного множества) количество знаков не равно 5-ти и условие нахождения одного знака в конце строки не выполнено, то файл не соответствует по формату.

Последний раз редактировалось SergiOD; 15.03.2011 в 12:01.
SergiOD вне форума Ответить с цитированием
Старый 15.03.2011, 12:22   #2
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

пусть S - строка.
вариант 1:
Код:
for I:=length(s) downto 1 do begin
if s[I]<>';' do delete(s,I,1);
end;
if length(s)>5 then {не соответствует}
вариант 2:
Код:
var
x:integer;
.............
x:=0;
for I:=1 to length(s) do begin
if s[I]=';' then inc(x);
end;
if x<>5 then {не соответствует}
и далее в том же духе.

а вобще... ошибку было бы лучше определять во время парсинга строк...

Код:
while pos(';',s)>0 do begin
s1:=copy(s,1,pos(';',s)-1);
delete(s,1,pos(';',s));
if pos(';',s)=0 then {error}{после каждого удаления, кроме последнего}
s2:=copy(s,1,pos(';',s)-1);
delete(s,1,pos(';',s));
{и тд} 
end;
варианты взяты из ума, на скорую руку и без компилятора... возможны синтаксические ошибки или болеепростые способы.
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}

Последний раз редактировалось Johnson; 15.03.2011 в 12:26.
Johnson вне форума Ответить с цитированием
Старый 15.03.2011, 14:09   #3
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Ну, как вариант.
Давно как-то делал програмку, там был поиск подстроки со * и ?.
Код:
type
  TRequiredStr = array of string;

function CreateRequiredStr (AStr: String): TRequiredStr;
var
  i: Integer;
  FResult: TRequiredStr;
  rabS: String;
  c: Char;

  function CountResult: Integer;
  begin
    CountResult := Length (FResult);
  end;

begin
  SetLength (FResult, 0);

  rabS := '';
  for i := 1 to Length (AStr) do begin
    c := AStr [i];
    if c = '?' then begin
      if rabS <> '' then begin
        SetLength (FResult, CountResult + 1);
        FResult [CountResult-1] := rabS;
        rabS := '';
      end;
      SetLength (FResult, CountResult + 1);
      FResult [CountResult-1] := '?';
    end
    else begin
      if c = '*' then begin
        if rabS <> '' then begin
          SetLength (FResult, CountResult + 1);
          FResult [CountResult-1] := rabS;
          rabS := '';
        end;
      end
      else begin
        rabS := rabS + c;
      end;
    end;
  end;

  if rabS <> '' then begin
    SetLength (FResult, CountResult + 1);
    FResult [CountResult-1] := rabS;
  end;

  Result := FResult;
end;

function FindText (ARequiredStr, AStr: String): Boolean;
var
  i, j: Integer;
  RequiredStr: TRequiredStr;
  rabS: String;
begin
  Result := True;
  RequiredStr := CreateRequiredStr (ARequiredStr);
  for i := 0 to Length (RequiredStr)-1 do begin
    rabS := RequiredStr [i];
    if rabS = '?' then begin
      if AStr = '' then begin
        Result := False;
        Break;
      end;
      Delete (AStr, 1, 1);
    end
    else begin
      j := Pos (rabS, AStr);
      if j > 0 then begin
        Delete (AStr, 1, j + Length (rabS) - 1);
      end
      else begin
        Result := False;
        Break;
      end;
    end;
  end;
end;
Использовать в этом случае можно вот так
Код:
  ...
  s1 := '?*;?*;?*;?*;?*;';
  s2 := ';*;*;*;*;*;';
  s3 := '?*;?*;?*;?*;?*;?';
  if (FindText (s1, stroka)) and
     (not FindText (s2, stroka)) and
     (not FindText (s3, stroka)) then
    ShowMessage ('Годится')
  else
    ShowMessage ('Не годится');
  ...
Sibedir вне форума Ответить с цитированием
Старый 15.03.2011, 14:42   #4
SergiOD
 
Регистрация: 11.12.2010
Сообщений: 8
По умолчанию

Попробую - отпишусь, спасибо!
SergiOD вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сверить данные с БД Alex2009 PHP 6 28.11.2010 17:46
импорт из txt, работа с массивом данных, экспорт в txt Danara Microsoft Office Excel 4 31.03.2010 00:26
Сверить Данные valerij Microsoft Office Excel 19 12.01.2010 18:43
Как сверить между собой данные двух файлов excel? Vadim_abs Microsoft Office Excel 8 10.11.2009 13:04
Как прочесть txt файл www.site.ru/info.txt BR17UY Работа с сетью в Delphi 1 16.04.2007 13:01