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

Вниз

Выборка данных из файла   Найти похожие ветки 

 
n_sch   (2012-09-21 18:41) [0]

Добрый день. Подскажите пожалуйста, как выбрать данные из файла и запихнуть их в memo.Есть файл примерно такого содержания:
                     <Сотрудник Нпп="1">
  <Фамилия>Иванов</Фамилия>
  <Имя>Анатолий</Имя>
  <Отчество>Сергеевич</Отчество>
<ФилиалОтделенияБанка>0062</ФилиалОтделенияБанка>
  <Сумма>100.78</Сумма>
 </Сотрудник>
 <Сотрудник Нпп="2">
  <Фамилия>Сидорова</Фамилия>
  <Имя>Светлана</Имя>
  <Отчество>Геннадьевна</Отчество>
<ФилиалОтделенияБанка>0062</ФилиалОтделенияБанка>
  <Сумма>200.48</Сумма>
 </Сотрудник>
 <Сотрудник Нпп="3">
  <Фамилия>Петров</Фамилия>
  <Имя>Андрей</Имя>
  <Отчество>Валерьевич</Отчество>
<ФилиалОтделенияБанка>0062</ФилиалОтделенияБанка>
  <Сумма>300.04</Сумма>
 </Сотрудник>

надо что бы в memo было так:
Иванов;Анатолий;Сергеевич;100.78
Сидорова;Светлана;Геннадьевна;200.48
Петров;Андрей;Валерьевич;300.04

открываю файл

procedure TForm1.Button3Click(Sender: TObject);
begin
OpenDialog1.Execute;
f:=OpenDialog1.FileName;
listaccount:= Tstringlist.Create;
listaccount.LoadFromFile(f);
end;
и пытаюсь обработать следующим образом:
var
 Form1: TForm1;
 f:string;
  listaccount::TStringList;
  TempS : string;
Res,Res1,Res2,Res3: string;
I : word;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var x:integer;
begin

for x:=0 to listaccount.Count-1 do begin

listaccount.Move(x,listaccount.Count-1);

if (pos ("Сотрудник Нпп=""+inttostr(x)+"">",listaccount[x])>0) then begin

TempS := StrPos (PChar (listaccount.GetText), PChar ("<Фамилия>"));
Delete (TempS, 1, Length ("<Фамилия>"));
I := 1;
Res := "";
While (TempS[I] <> "<") and (I <= Length (TempS)) do begin
  Res := Res + TempS[I];
  INC (I);
end;
TempS := StrPos (PChar (listaccount.GetText), PChar ("<Имя>"));
Delete (TempS, 1, Length ("<Имя>"));
I := 1;
Res1 := "";
While (TempS[I] <> "<") and (I <= Length (TempS)) do begin
  Res1 := Res1 + TempS[I];
  INC (I);
end;
TempS := StrPos (PChar (listaccount.GetText), PChar ("<Отчество>"));
Delete (TempS, 1, Length ("<Отчество>"));
I := 1;
Res2 := "";
While (TempS[I] <> "<") and (I <= Length (TempS)) do begin
  Res2 := Res2 + TempS[I];
  INC (I);
end;
TempS := StrPos (PChar (listaccount.GetText), PChar ("<Сумма>"));
Delete (TempS, 1, Length ("<Сумма>"));
I := 1;
Res3 := "";
While (TempS[I] <> "<") and (I <= Length (TempS)) do begin
  Res3 := Res3 + TempS[I];
  INC (I);
end;
 end;
Memo1.Lines.Append(res+";"+res1+";"+res2+";"+Res3);
 end;
end;

В memo выходит фигня, подскажите что делаю не так????
Спасибо....


 
Медвежонок Пятачок ©   (2012-09-21 19:00) [1]

фигню пишешь выходит фигня.
"нормально делай - нормально будет" - это я на футболке одной прочитал


 
Медвежонок Пятачок ©   (2012-09-21 19:02) [2]

ps с xml файлом надо работать как с xml файлом.
а если хочешь как с тектовым, то надо выучить арифметику, чтобы правильно указывать индексы при операциях удаления и копирования строк


 
n_sch   (2012-09-21 19:29) [3]

Уважаемый ткни пожалуйста пальцем, ГДЕ ошибка ???? У меня уже "башня" едет....


 
Anatoly Podgoretsky ©   (2012-09-21 19:42) [4]

> n_sch  (21.09.2012 18:41:00)  [0]

Фигня разная бывает, у тебя какая?


 
Медвежонок Пятачок ©   (2012-09-21 19:43) [5]

Ошибка номер один.
Не работай с этим как с текстом.


 
брат Птибурдукова   (2012-09-21 19:49) [6]


> ГДЕ ошибка ????
В подходе. Хотя бы кинь на форму TXmlDocument и разбирайся.

Ну, можно ещё xslt нарисовать, которым можно будет получить файлик искомого формата... %-)


 
n_sch   (2012-09-21 20:03) [7]

Подскажите, а что такое xslt ?  Это компонент deplhi ?


 
n_sch   (2012-09-21 20:07) [8]

А на счет фигни которая появляется в memo, строки "кривые" т.е. фамилия первого, отчество второго, сумма опять первого и так весь список....


 
Медвежонок Пятачок ©   (2012-09-21 20:10) [9]

переставь местами


 
n_sch   (2012-09-21 20:39) [10]

То есть? Это как ? Где в цикле

for x:=0 to listaccount.Count-1 do begin

listaccount.Move(x,listaccount.Count-1);

if (pos ("Сотрудник Нпп=""+inttostr(x)+"">",listaccount[x])>0) then begin
...............
................

ошибка? Что я не так делаю?


 
Медвежонок Пятачок ©   (2012-09-21 20:53) [11]

в основном то, что не слушаешь.


 
Юрий Зотов ©   (2012-09-22 15:26) [12]

> n_sch

Это не просто текст, а текст в формате XML. С ним и надо работать не как с простым текстом (через Memo), а как с текстом специального формата. И об этом Вам уже говорили в [5] и в [6]. См. TXmlDocument и справку по нему.


 
Юрий Зотов ©   (2012-09-22 16:24) [13]

procedure TForm1.FormDblClick(Sender: TObject);
var
 i: integer;
begin
 with XMLDocument1, XML do
 begin
   LoadFromFile("D:/Temp/Сотрудники.xml");
   Insert(0, "<Сотрудники>");
   Add("</Сотрудники>");
   Insert(0, "<?xml version="1.0" encoding="Windows-1251"?>");
   Active := True
 end;
 with XMLDocument1.DocumentElement.ChildNodes do
   for i := 0 to Count - 1 do
   with Nodes[i] do
     Memo1.Lines.Add(Format("%s;%s;%s;%s",
       [ChildValues["Фамилия"], ChildValues["Имя"], ChildValues["Отчество"], ChildValues["Сумма"]]))
end;


 
Edgar_Wine   (2012-09-25 13:10) [14]

Вообще поддерживаю что с xml файлом надо работать как с xml файлом, но уметь менять текст (не xml, а любой) так как требуется в конкретном случае - всё же надо. =)

procedure TForm1.Button1Click(Sender: TObject);
var S: String; a, b: Integer;
begin
S:=Memo1.Text;
S:=StringReplace(S, " ",                       "",     [rfReplaceAll, rfIgnoreCase]); // выкидываем пробелы
S:=StringReplace(S, #13,                       "",     [rfReplaceAll, rfIgnoreCase]); // выкидываем переносы строк Nix
S:=StringReplace(S, #10,                       "",     [rfReplaceAll, rfIgnoreCase]); // выкидываем переносы строк Mac
S:=StringReplace(S, "<Фамилия>",               "",     [rfReplaceAll, rfIgnoreCase]);
S:=StringReplace(S, "</Фамилия>",              ";",    [rfReplaceAll, rfIgnoreCase]);
S:=StringReplace(S, "<Имя>",                   "",     [rfReplaceAll, rfIgnoreCase]);
S:=StringReplace(S, "</Имя>",                  ";",    [rfReplaceAll, rfIgnoreCase]);
S:=StringReplace(S, "<Отчество>",              "",     [rfReplaceAll, rfIgnoreCase]);
S:=StringReplace(S, "</Отчество>",             ";",    [rfReplaceAll, rfIgnoreCase]);
S:=StringReplace(S, "<ФилиалОтделенияБанка>",  "<",    [rfReplaceAll, rfIgnoreCase]);
S:=StringReplace(S, "</ФилиалОтделенияБанка>", ">",    [rfReplaceAll, rfIgnoreCase]);
S:=StringReplace(S, "<Сумма>",                 "",     [rfReplaceAll, rfIgnoreCase]);
S:=StringReplace(S, "</Сумма>",                ";",    [rfReplaceAll, rfIgnoreCase]);
S:=StringReplace(S, "</Сотрудник>",            #13#10, [rfReplaceAll, rfIgnoreCase]);
a:=Pos("<", S);
b:=Pos(">", S);
while ((a>0) and (b>0)) do
     begin
     S:=Copy(S, 1, a-1)+Copy(S, b+1, Length(S)-b);
     a:=Pos("<", S);
     b:=Pos(">", S);
     end;
Memo1.Text:=S;
end;


 
n_sch   (2012-09-26 11:15) [15]

Спасибо, кажеться начал понимать.


 
brother ©   (2012-09-26 11:34) [16]

надеюсь работадатель присмотрится к тебе ближе после осмотра твоего "кода", ибо не понимать, что есть структурные файлы и писать что-либо для финансовой сферы - черевато!



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

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

Наверх




Память: 0.51 MB
Время: 0.012 c
8-1227438798
Б
2008-11-23 14:13
2013.03.31
Графика


15-1354371990
AlexKniga
2012-12-01 18:26
2013.03.31
Использование ICQ и права на текст сообщений


15-1354981340
dummy_user
2012-12-08 19:42
2013.03.31
Как это называется...


15-1354653003
Юрий
2012-12-05 00:30
2013.03.31
С днем рождения ! 5 декабря 2012 среда


15-1355074113
alexdn
2012-12-09 21:28
2013.03.31
Доступ к mysql