Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.10.2016, 17:49
ApxaHGe1 ApxaHGe1 вне форума
Активный
 
Регистрация: 08.04.2008
Адрес: Нижний новгород
Сообщения: 311
Репутация: 38
По умолчанию Помогите разобрать файл

Добрый вечер, есть файл с остатками товара выгруженный из 1С в формате HTML

Мне нужно из него получить такие вещи как:
1. Категория товара
2. Название товара
3. Артикул товара (он пишется в конце названия товара)
4. Остаток на складе
5. Цена товара

Все сделал, получаю и артикул и цену и название товара и остатки.
Все вроде бы просто, Но не могу сообразить, как сделать так что бы рядом с каждым товаром ( с названием товара ) писалась категория, до тех пор, пока парсится товар из данной категории. Закончилась одна категория товаров, перешли к следующей....

Примерно вот так


Категория упоминается только один раз, перед началом списка товаров

Вот только в этом весь ступор ))

Оригинальный файл с таблицей остатков прикрепил
Вложения
Тип файла: rar Остатки.rar (26.9 Кбайт, 2 просмотров)
Ответить с цитированием
  #2  
Старый 13.10.2016, 19:27
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Категория идет отдельным тегом (группой тегов). Как я понял, саму группу тегов ты распознаешь. Тогда алгоритм примерно такой.
Перед циклом обнуляешь переменную, в которой у тебя будет названии категории.
Внутри цикла если нашел категорию, то запоминаешь ее. если это товар, то берешь категорию из переменной.

Типа такого (код условный):
Код:
var
  CatName : String;
  DataRow : TDataRowObject; // типа результат получения строки
begin
  CatName := '';
  Repeat
    DataRow := ParseHTML(...); // получаем очередную строку из хтмл'я
    If DataRow.IsCategory 
     Then CatName := DataRow.Name // сохраняем имя категории
     Else AddRow(CatName, DataRow.Name, DataRow.Art, DataRow.Proce, DataRow.Quantity); // иначе - добавляем строку
  Until DataRow = Nil;
как уже сказал, код условный, просто что бы продемонстрировать концепцию.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
ApxaHGe1 (17.10.2016)
  #3  
Старый 13.10.2016, 19:46
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Категорию, название, артикул (считываю с конца строки до первого пробела) и цену удалось распарсить, где остаток на складе искать?
Ответить с цитированием
  #4  
Старый 14.10.2016, 10:33
ApxaHGe1 ApxaHGe1 вне форума
Активный
 
Регистрация: 08.04.2008
Адрес: Нижний новгород
Сообщения: 311
Репутация: 38
По умолчанию

Цитата:
Сообщение от Alegun
Категорию, название, артикул (считываю с конца строки до первого пробела) и цену удалось распарсить, где остаток на складе искать?
Остаток вот

Мне удалось все распарсить но не могу заставить что бы писал рядом категорию товара... т.е.
что бы на выходе получилось нечто
Ответить с цитированием
  #5  
Старый 14.10.2016, 16:16
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Вот пример для D7, но немного глючит - лишние теги пролезают
Вложения
Тип файла: zip parshtm.zip (31.7 Кбайт, 1 просмотров)
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
ApxaHGe1 (14.10.2016)
  #6  
Старый 14.10.2016, 16:57
ApxaHGe1 ApxaHGe1 вне форума
Активный
 
Регистрация: 08.04.2008
Адрес: Нижний новгород
Сообщения: 311
Репутация: 38
По умолчанию

Спасибо, буду разбираться и заберу часть кода себе
Все прекрасно работает, только 1 ньюанс, он берет цену, общего количества... т.е. 5 штук товара например) а надо одного товара) Но это я уже исправил

Последний раз редактировалось ApxaHGe1, 14.10.2016 в 17:21.
Ответить с цитированием
  #7  
Старый 14.10.2016, 17:36
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Тогда нужно заменить блок цикла на
Код:
...
for b:= Length(d) downto 1 do
          if d[b] = ' ' then
           begin
            lit.SubItems.Add(Copy(d, 1, b-1));
            lit.SubItems.Add(Copy(d, b+1, Length(d)));
            lit.SubItems.Add(Copy(txtAll[i+2],46,Length(txtAll[i])));
            lit.SubItems.Add(Copy(txtAll[i+3],30,Length(txtAll[i])));
            break;
           end;
...

З.Ы. Ой, про "это я уже исправил" не заметил :-)
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
ApxaHGe1 (17.10.2016)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:27.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter