Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2011, 09:15   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
Вопрос Разделение строки на колонки в StringGrid

Добрый день! Прошу помощи с реализацией такой штуки. Есть загруженный текстовый файл в Мемо:
Код:
<?xml version="1.0" encoding="windows-1251"?>
<zl_list>
	<zglv><filename>38104TQ01001</filename><nfile>001</nfile><version>1.0</version><cod_pfr>048</cod_pfr><nrec>100000</nrec></zglv>
	<zl><nomer_z>0000000001</nomer_z><snils>00000000</snils><fam>Иванов</fam><im>Иван</im><ot>Иванович</ot><dr>01.01.1962</dr><w>М</w></zl></zl_list>
таких строк, которые начинаются с <zl><nomer_z>... может быть несколько тысяч. Все они в Мемо отображатся столбцом, это хорошо. Вопрос возник такой: как вытащить значения которые находятся между <nomer_z>....</nomer_z>, <snils>...</snils>, <fam>...</fam>, <im>...</im>, <ot>...</ot>, <dr>...</dr>, <w>...</w> и занести их в разные столбцы в StringGrid? И чтобы такая процедура выполнилась для всех строк. Вот, только с этим и возникла сложность. Прошу помочь реальными советами или кодом, а не флудом. Заранее спасибо.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 26.03.2011, 10:48   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

вот пример работы с XML файлом.

Код:
uses xmldoc, xmlintf;

procedure TDMNOAX9.FindLoadfile;
var
  xml: IXMLDocument;
  xnode: IXMLNode;
  s: string;
begin
  if self.OpenDialog1.Execute then begin
     xml:=LoadXMLDocument(self.OpenDialog1.FileName);
     xnode:=xml.DocumentElement;
     s:=xnode.NodeName;
     if uppercase(s)='IMPORT' then begin
       self.LoadSprList(xnode.ChildNodes);
     end;
  end;
end;

procedure TDMNOAX9.LoadSprList(xlist: IXMLNodeList);
var
  xnode: IXMLNode;
  s: string;
  spr: TSPR;
begin
  xnode:=xlist.First;
  while xnode<>nil do begin
    s:=xnode.NodeName;
    if s='SPR' then begin
      spr:=TSPR.Create;
      self.FsprList.Add(spr);
      spr.LoadSpr(xnode.ChildNodes);
    end;
    xnode:=xnode.NextSibling;
  end;
end;
Код:
procedure TSPR.LoadSpr(Axlist: IXMLNodeList);
var
  xnode: IXMLNode;
  s: string;
  x: TOBL;
begin
//  <SPR><IDENT>LR</IDENT><NAME>чтото там</NAME><DT>01.01.2000</DT>
  xname:=Axlist.FindNode('NAME');
  xdate:=Axlist.FindNode('DT');
  xident:=Axlist.FindNode('IDENT');
  xnode:=Axlist.First;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 26.03.2011 в 11:10.
evg_m вне форума Ответить с цитированием
Старый 26.03.2011, 12:08   #3
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

А хотя бы в двух словах-то можешь пояснить? А то такой код-то можно какой угодно написать и не факт будет, что он поможет.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 26.03.2011, 12:16   #4
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Я думаю тебе показали как работать с XML для того, что ты распарсил с помощью него данные и раскидал результат по StringGrid как тебе нужно.
psycho-coder вне форума Ответить с цитированием
Старый 26.03.2011, 12:53   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

IXMLDocument документрован (есть в справке).

Код:
 xml:=LoadXMLDocument(self.OpenDialog1.FileName);//загрузка документа
 xnode:=xml.DocumentElement; //получение корневого узла
 s:=xnode.NodeName; //получение имени узла
 xnode.ChildNodes; // получение списка дочерних узлов
 xname:=Axlist.FindNode('NAME'); //поиск узла по имени

 xnode:=xlist.First; // первый узел в списке
 xnode:=xnode.NextSibling;//следующий узел того же уровня
 xnode.Text; //значение  узла
P.S. код был взят с рабочего проекта.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 26.03.2011 в 12:57.
evg_m вне форума Ответить с цитированием
Старый 27.03.2011, 07:54   #6
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Что в коде в посте №2 значат эти строки?
Код:
uses xmldoc, xmlintf;

procedure TDMNOAX9.FindLoadfile;
var
  xml: IXMLDocument;
  xnode: IXMLNode;
  s: string;
begin
  if self.OpenDialog1.Execute then begin
     xml:=LoadXMLDocument(self.OpenDialog1.FileName);
     xnode:=xml.DocumentElement;
     s:=xnode.NodeName;
     if uppercase(s)='IMPORT' then begin
       self.LoadSprList(xnode.ChildNodes);
     end;
  end;
end;

procedure TDMNOAX9.LoadSprList(xlist: IXMLNodeList);
var
  xnode: IXMLNode;
  s: string;
  spr: TSPR;
begin
  xnode:=xlist.First;
  while xnode<>nil do begin
    s:=xnode.NodeName;
    if s='SPR' then begin
      spr:=TSPR.Create;
      self.FsprList.Add(spr);
      spr.LoadSpr(xnode.ChildNodes);
    end;
    xnode:=xnode.NextSibling;
  end;
end;

Код:

procedure TSPR.LoadSpr(Axlist: IXMLNodeList);
var
  xnode: IXMLNode;
  s: string;
  x: TOBL;
begin
//  <SPR><IDENT>LR</IDENT><NAME>чтото там</NAME><DT>01.01.2000</DT>
  xname:=Axlist.FindNode('NAME');
  xdate:=Axlist.FindNode('DT');
  xident:=Axlist.FindNode('IDENT');
  xnode:=Axlist.First;
Цитата:
P.S. код был взят с рабочего проекта.
Нет ли возможности у тебя скинуть этот пример проекта, чтобы посмотреть как и что объявлено там?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 27.03.2011, 09:05   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

self обращение внутри метода к своему собственному объекту(экземпляру класса). this в С++.
Можно его спокойно убрать.

Цитата:
Нет ли возможности у тебя скинуть этот пример проекта, чтобы посмотреть как и что объявлено там?
вот держи комментарии внутри (работу с БД не комментировал так что Exception ПОСЛЕ разбора обеспечено).
Вложения
Тип файла: zip TESTXML.zip (6.1 Кб, 71 просмотров)
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 27.03.2011, 09:30   #8
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Спасибо за выложенный пример. Однако ничего кроме мата на параметр не получается. Что должно быть конечным результатом работы программы?
Изображения
Тип файла: png 1.png (15.2 Кб, 183 просмотров)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 27.03.2011, 10:11   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
(работу с БД не комментировал так что Exception ПОСЛЕ разбора обеспечено).
Результат Выгрузка в БД. Закоммментируй операции с ADOcommand.

или
Код:
class procedure TDMNOAX9.LoadXML;
var
  dm: TDMNOAX9;
begin
  dm:=TDMNOAX9.Create(nil);
// нажодим (тест.xml), читаем и разбираем файл
  dm.FindLoadFile;
// документ разобран (создан набор вложенных классов
// отвечающих каждый за один из узлов документа
// и знающих КАК и ЧТО делать с этими данными
// проверка загрузка в БД
///  dm.SaveSprList(dm.ADOCommand1);
  dm.Free;
end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
разделение строки zhenya.ya Общие вопросы C/C++ 14 24.03.2011 23:45
Разделение строк в StringGrid на группы Хохол Компоненты Delphi 6 21.03.2011 11:51
Разделение строки QuestionMark Microsoft Office Excel 2 22.06.2010 15:00
разделение текста из ссылки на 2 колонки nuts113 Microsoft Office Excel 2 05.05.2010 09:02
Длина колонки StringGrid в процентах KLOP Общие вопросы Delphi 4 27.04.2010 12:35