Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Вниз

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

 
Альф   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.029 c
2-1132303903
LionMen
2005-11-18 11:51
2005.12.11
Консольное приложение


14-1132697502
NightLord
2005-11-23 01:11
2005.12.11
Новая дыра в IE


1-1132129440
pav74
2005-11-16 11:24
2005.12.11
Мастера! кто-то знает алгоритм автоматизации контроля температуры


3-1130232267
Ega23
2005-10-25 13:24
2005.12.11
could not produce a query plan from the optimizer - что это???


2-1132675777
VadimSpb
2005-11-22 19:09
2005.12.11
SQL запрос





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский