Текущий архив: 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