![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Извлечение данных из текстовых файлов [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]
>
> С чего начать при решении такой задачи
С постановки задачи. И с формального описания формата данных.