Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.11;
Скачать: CL | DM;

Вниз

Извлечение данных из текстовых файлов   Найти похожие ветки 

 
Альф   (2005-11-11 14:53) [0]

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

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

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

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


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


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

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


 
Digitman ©   (2005-11-11 14:57) [2]

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


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

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

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

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


 
Digitman ©   (2005-11-11 15:17) [4]

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


 
Leonid Troyanovsky ©   (2005-11-11 15:27) [5]


> Альф   (11.11.05 14:53)  

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


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

--
Regards, LVT.


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

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


 
tesseract ©   (2005-11-11 18:03) [7]

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


 
Fostr   (2005-11-11 18:28) [8]

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


 
Fostr   (2005-11-11 18:28) [9]

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


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

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

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;


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

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



Страницы: 1 вся ветка

Текущий архив: 2005.12.11;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.046 c
2-1133021816
0xBAD
2005-11-26 19:16
2005.12.11
DLL


2-1132683001
DillerXX
2005-11-22 21:10
2005.12.11
RegQueryValueEx


1-1132156198
Asail
2005-11-16 18:49
2005.12.11
Вопрос по компоненте IAeverButton....


6-1125493756
Alex870
2005-08-31 17:09
2005.12.11
idTCPServer и idTCPClient


2-1132488605
alexab
2005-11-20 15:10
2005.12.11
Использование for...to...do