Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Извлечение данных из текстовых файлов [D5, Win2k]


Альф ©   (2005-11-11 14:53:00) 

Подскажите пожалуйста способы решения такой задачи:

Есть текстовый файл с результатами, который сгенерирован старой DOS-программой - своеобразные группированый отчет с ASCII графикой и колонками цифр разделенные пробелом.
Нужно из этого файла вытянуть необходимые данные, причем положение самих данных можно определить по уникальным строкам вида

6.СРЕДНЯЯ ТЕМПЕРАТУРА ВОЗДУХА ЗА РАСЧЕТ-     | градус │  
НЫЙ ПЕРИОД                                 |Цельсия │         0.0000│

С чего начать при решении такой задачи ?


vrem   (2005-11-11 18:37:00) [1]

Синоптик, это не очень грандиозно - задачка твоя, неужто не справляешься?


Бур   (2005-11-11 18:33:00) [2]

Простейший вариант:

function FindS(L: TStringList; var N: Integer; const SubS: String): Boolean;
var
 i: Integer;
 Len: Integer;
begin
 Len := Length(SubS);
 Result := False;

 for i := N to L.Count-1 do
 begin
   if Length(L[i])>=Len then
   begin
     if Copy(L[i],1,Len)=SubS then
     begin
       Result := True;
       N := i;
       Exit;
     end;
   end;
 end;
end;

procedure Process(const FIn,FOut: String);
type
 TState=(stNone,stDateDoc,stNumDoc,stInnDt,stNameDt,stAccDt,stBankDt,stCityDt,
         stBankKt,stCityKt,stInnKt,stNameKt,stNazn);
 TDoc=record
   DateDoc,
   NDoc,
   InnDt,
   Summ,
   NameDt,
   AccDt,
   BankDt,
   BikDt,
   CityDt,
   KsDt,
   BankKt,
   BikKt,
   CityKt,
   KsKt,
   InnKt,
   AccKt,
   NameKt,
   Nazn: String;
 end;
var
 L,L1: TStringList;
 i: Integer;
 State: TState;
 Doc: TDoc;
begin
 L := TStringList.Create;
 L.LoadFromFile(FIn);
 L1 := TStringList.Create;

 i := 0;
 State := stNone;
 while i<L.Count do
 begin
   case State of
     stNone:
       begin
         if not FindS(L,i,'ПЛАТЕЖНОЕ ПОРУЧЕНИЕ N') then Break;
         Dec(i);
         Doc.DateDoc := Copy(L[i],56,10);
         State := stDateDoc;
       end;
     stDateDoc:
       begin
         Inc(i);
         Doc.NDoc := Trim(Copy(L[i],23,5));
         State := stNumDoc;
       end;
     stNumDoc:
       begin
         if not FindS(L,i,'ИНН') then Break;
         Doc.InnDt := Trim(Copy(L[i],5,12));
         Doc.Summ := Trim(Copy(L[i],71,18));
         Doc.Summ := StringReplace(Doc.Summ,'-',DecimalSeparator,[rfReplaceAll]);
         Inc(i,2);
         Doc.NameDt := Trim(Copy(L[i],1,59));
         Inc(i);
         Doc.NameDt := Doc.NameDt+' '+Trim(Copy(L[i],1,59));
         Inc(i);
         Doc.NameDt := Doc.NameDt+' '+Trim(Copy(L[i],1,59));
         Doc.NameDt := Trim(Doc.NameDt);
         Inc(i);
         Doc.AccDt := Trim(Copy(L[i],71,20));
         Inc(i,5);
         DOc.BankDt := Trim(Copy(L[i],1,59));
         Doc.BikDt := Trim(Copy(L[i],71,9));
         Inc(i);
         Doc.BankDt := Doc.BankDt+' '+Trim(Copy(L[i],1,59));
         Inc(i);
         Doc.BankDt := Doc.BankDt+' '+Trim(Copy(L[i],1,59));
         Doc.BankDt := Trim(Doc.BankDt);
         Inc(i);
         Doc.CityDt := Trim(Copy(L[i],1,59));
         Doc.KsDt := Trim(Copy(L[i],71,9));
         Inc(i,3);
         DOc.BankKt := Trim(Copy(L[i],1,59));
         Doc.BikKt := Trim(Copy(L[i],71,9));
         Inc(i);
         Doc.BankKt := Doc.BankKt+' '+Trim(Copy(L[i],1,59));
         Inc(i);
         Doc.BankKt := Doc.BankKt+' '+Trim(Copy(L[i],1,59));
         Doc.BankKt := Trim(Doc.BankKt);
         Inc(i);
         Doc.CityKt := Trim(Copy(L[i],1,59));
         Doc.KsKt := Trim(Copy(L[i],71,9));
         Inc(i,3);
         Doc.InnKt := Trim(Copy(L[i],5,12));
         Doc.AccKt := Trim(Copy(L[i],71,20));
         Inc(i,2);
         Doc.NameKt := Trim(Copy(L[i],1,59));
         Inc(i);
         Doc.NameKt := Doc.NameKt+' '+Trim(Copy(L[i],1,59));
         Inc(i);
         Doc.NameKt := Doc.NameKt+' '+Trim(Copy(L[i],1,59));
         Doc.NameKt := Trim(Doc.NameKt);
         Inc(i,9);
         Doc.Nazn := Trim(Copy(L[i],1,107));
         Inc(i);
         Doc.Nazn := Doc.Nazn+' '+Trim(Copy(L[i],1,107));
         Inc(i);
         Doc.Nazn := Doc.Nazn+' '+Trim(Copy(L[i],1,107));
         Doc.Nazn := Trim(Doc.Nazn);
         L1.Add(
           Doc.DateDoc+#9+
           Doc.NameDt+','+' ИНН:'+Doc.InnDt+#9+
           Doc.AccDt+#9+
           Doc.BankDt+', '+ 'БИК:'+Doc.BikDt+', '+Doc.CityDt+#9+

           Doc.NameKt+','+' ИНН:'+Doc.InnKt+#9+
           Doc.AccKt+#9+
           Doc.BankKt+', '+ 'БИК:'+Doc.BikKt+', '+Doc.CityKt+#9+

           Doc.Summ+#9+
           Doc.DateDoc+#9+
           Doc.NDoc+#9+
           Doc.Nazn
         );
         State := stNone;
       end;
   end;
 end;
 L1.CustomSort(CSort);
 for i := 0 to L1.Count-1 do
 begin
   L1[i] := IntToStr(i+1)+#9+Copy(L1[i],12,10000);
 end;
 L1.SaveToFile(FOut);
 L1.Free;
 L.Free;

end;


Fostr   (2005-11-11 18:28:00) [3]

У меня подобная проблема была... Мне помо TStringList.
Считываешь в него весь файл, потом построчно проверяешь налие нужного тебе в ней текста и с нужной позиции читаешь этот нужный текст.


Fostr   (2005-11-11 18:28:00) [4]

Удалено модератором


tesseract   (2005-11-11 18:03:00) [5]

Может быть подойдёт:
res:=copy(readstr,1,pos('|', ReadLine)-1);


OldNaum   (2005-11-11 16:57:00) [6]

гы, а может регулярными выражениями попробовать? ))


Leonid Troyanovsky   (2005-11-11 15:27:00) [7]


> Альф   (11.11.05 14:53)  

> С чего начать при решении такой задачи ?


Открыть оный файл в Excel.
Ну, и сохранить после хоть в *.mdb.

--
Regards, LVT.


Digitman   (2005-11-11 15:17:00) [8]

приведи реальноесодержимое (Copy/Paste) пары-тройки строк такого файла


Альф   (2005-11-11 15:09:00) [9]

>Digitman ©   (11.11.05 14:57) [2]
>с построчного считывания из файла.

вот-вот примерно так и я думал - завести список таких уникальных строк с возможными позициями нужных мне данных, а потом поиском извлекать строки из файла и пытаться вытянуть число по позиции

но может ктото сталкивался с таким и знает более простое решение ?


Digitman   (2005-11-11 14:57:00) [10]

с построчного считывания из файла.


Джо   (2005-11-11 14:56:00) [11]


>
> С чего начать при решении такой задачи

С постановки задачи. И с формального описания формата данных.


Наверх

Титульная страница Поиск, карта сайта Написать письмо