Главная страница
    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.48 MB
Время: 0.046 c
8-1121087757
izvr
2005-07-11 17:15
2005.12.11
Проигрывание видеофайлов без остановок


6-1124963167
ShuRiK_0481
2005-08-25 13:46
2005.12.11
Как получить Location из URL?


8-1120935016
murtix
2005-07-09 22:50
2005.12.11
Gdi+ и Delphi 2005


1-1131936511
Razor
2005-11-14 05:48
2005.12.11
Как правильнее передавать строки в DLL?


8-1121037044
Yura32
2005-07-11 03:10
2005.12.11
OpenGL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский