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

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

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2017, 12:17   #21
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Serge_Bliznykov алгоритмом/исходником поделитесь?
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 30.03.2017, 13:24   #22
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
Serge_Bliznykov алгоритмом/исходником поделитесь?
так это на Delphi сделано.
Ничего?

Тогда - легко!

Алгоритм (если это можно назвать "алгоритмом" ) - это простейший автомат (с переходами по совпадению с ключевыми значениями).

вот так это выглядит в коде:

Код:
procedure CopyRange(var TSFrom, TSTo : TStringList; FromIndex, ToIndex : integer);
var i : integer;
begin
  for i := FromIndex to ToIndex do TSTo.Append(TSFrom.Strings[i]);
end;

procedure TForm1.Button1Click(Sender: TObject);
var TS, TSNew : TStringList;
  sFind : string;
  i, BegDoc : integer;
  isFound : boolean;
begin
  if trim(edInputFile.Text)='' then begin
     Application.MessageBox('Укажите имя входного файла','Ошибка ввода данных', MB_ICONERROR or MB_OK );
     exit;
  end;
  if trim(edINN.Text)='' then begin
     Application.MessageBox('Укажите ИНН для поиска','Ошибка ввода данных', MB_ICONERROR or MB_OK );
     exit;
  end;
  if trim(edOutputFile.Text)='' then begin
     Application.MessageBox('Укажите имя выходного файла','Ошибка ввода данных', MB_ICONERROR or MB_OK );
     exit;
  end;
  if Not FileExists(edInputFile.Text) then begin
     Application.MessageBox('Укажите имя существующего файла','Ошибка ввода данных', MB_ICONERROR or MB_OK );
     exit;
  end;

  TS := TStringList.Create;
  TS.LoadFromFile(edInputFile.Text);
  TSNew := TStringList.Create;

  mmLog.Lines.Clear;
  mmLog.Lines.Append('Начата обработка файла '+edInputFile.Text+' поиск ИНН='+edINN.Text);
  isFound := false;
  BegDoc := 0;
  sFind := AnsiUpperCase('ПлательщикИНН='+trim(edINN.Text));

  for i := 0 to TS.Count - 1 do begin
    if Copy(AnsiUpperCase(TS.Strings[i]),1,15)='СЕКЦИЯДОКУМЕНТ=' then begin
      if isFound then begin
          mmLog.Lines.Append('Ошибка! Для предыдущего документа с нужным ИНН нет завершающего тега "КонецДокумента"! Копируем всё до текущей строки...');
          CopyRange(TS, TSNew, BegDoc, i-1);
          isFound := false;
      end;
      BegDoc := i
    end
    else
      if AnsiUpperCase(TS.Strings[i])=sFind then begin isFound := true;
          mmLog.Lines.Append('Нужное ИНН найдено в строке '+IntToStr(i+1));
      end
      else
        if AnsiUpperCase(TS.Strings[i])='КОНЕЦДОКУМЕНТА' then begin
          if isFound then begin
              mmLog.Lines.Append('Найден тег "КонецДокумента", копируем строки от '+IntToStr(BegDoc+1)+' до строки '+IntToStr(i+1));
              CopyRange(TS, TSNew, BegDoc, i);
              isFound := false;
          end;
        end;
  end;

  if isFound then begin
       mmLog.Lines.Append('Ошибка! Для предыдущего документа с нужным ИНН нет завершающего тега "КонецДокумента"! Копируем всё до конца документа...');
       CopyRange(TS, TSNew, BegDoc, TS.Count - 1);
  end;

  if TSNew.Count>0 then begin
        mmLog.Lines.Append('сохраняем '+IntToStr(TSNew.Count)+' строк в файл '+edOutputFile.Text);
        TSNew.SaveToFile(edOutputFile.Text);
  end;
  mmLog.Lines.Append('---- конец обработки ----');

end;
собственно, здесь бОльшая часть кода - это обработка ошибок и вывод сообщений в лог.

а вот и исходники проекта целиком:
Copy_INN_Delphi_sources.rar
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Раскрасить ячейку dbgrideh Ernest027 БД в Delphi 13 12.08.2015 08:38
Раскрасить ListBox $T@LKER C# (си шарп) 8 05.04.2011 22:35
РАскрасить строки ListViev. Aleksandr Общие вопросы Delphi 20 17.09.2010 10:29
Раскрасить пузырьки в диаграмме danil1234567 Microsoft Office Excel 2 28.06.2010 18:03
Раскрасить DBGrid alex_base БД в Delphi 13 06.11.2007 11:36