| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Как правильно парсить xlTable |
| Автор: wallstreet 9.7.2012, 15:55 | ||
| Добрый день, подскажите кто знает, как правильно парсить данные в формате xlTable. Описание формата
Хотелось бы услышать совет с чего начать) На данном этапе я получаю данные в этом формате в массив типа BYTE, хотя возможно необходимо принимать их в char, создавать строку, а потом только парсить. Вобщем кто знает, проясните вопрос плз. Добавлено через 13 минут и 1 секунду поидее если по байтам пройтись циклом, то получится что после байта 0×0010 (tdtTable) второй будет означать кол-во байтов в данных, третий кол-во строк в экспортируемой таблице, а четвертый кол-во полей (столбцов). Только вот может есть функция какая-нибудь для работы с байтами или нет я не знаю? |
| Автор: wallstreet 10.7.2012, 13:16 | ||
Думаю надо делать как-то так:
Подскажите как это сделать правильно? Хотя бы намек на истину) |
| Автор: feodorv 10.7.2012, 14:34 |
Нет, не так. Пусть DataBuf имеет тип BYTE, но это не отменяет того факта, что в начале каждого блока стоят два WORD'а. Вы же всё равно считаете их байтами В начале DataBuf должен идти блок с типом tdtTable, к данным он не относится, лишь сообщает размеры таблицы. 256 - это что такое? Как это сочетается с числом байт в DataBuf? Кстати, где можно увидеть число байт в массиве DataBuf? Где он заканчивается??? Немного ссылок:
|
| Автор: borisbn 10.7.2012, 14:46 | ||
как-то так
Добавлено через 4 минуты и 44 секунды Всегда поражался "дальновидности" мелкомягких... Это ж надо - заложились на более чем 255 типов (!!!) данных в ячейке Добавлено через 10 минут и 42 секунды Учти, НЕ БУДЕТ компилироваться gcc, т.к. по стандарту не разрешено объявлять нулевые массивы. Студия же кушает и не ломается |
| Автор: feodorv 10.7.2012, 15:14 | ||
| borisbn Немного сложнее))) Ячейки могут объединяться в один блок И, по-моему, не float, а double... И ещё нужен контроль длины ячейки и выхода за пределы границы буфера:
А то мало ли какие данные на вход попадут... |
| Автор: borisbn 10.7.2012, 15:17 |
| feodorv, да, конечно... сложнее. Я просто дал чушку и напильник Добавлено через 50 секунд Лень было открывать документацию и досконально изучать, а ТСу это придётся делать |
| Автор: wallstreet 20.7.2012, 12:05 |
| Благодарю за помощь. Пилю гири)) Единственно я немного не понимаю каким образом cells объединяются в блоки?!?!?! К примеру пришел блок (ExcelBlockTable) с размерами таблицы (tableInfo->tdt), затем размер данных (tableInfo->cb) и затем сами данные. Данные заполняются по порядку, сначала первая строка (А1, B1, C1, D1....), потом вторая и тд. Так вот вопрос по объединению ячеек в блок. Правильно ли я понимаю, приходят данные сначала одного типа, потом второго и так далее? Или же приходят изначально построчно данные разных типов подряд, а потом уже, когда таблица заполнена, приходят блоками только те данные которые изменились в таблице??? Моя же задача при этом собирать эти данные, формировать в блоки и вставлять в мой список по их индексу в таблице (типо A1, D3, C2 )? Кстати некоторые импортируемые таблицы постоянно меняют размер, кол-во записей увеличивается постоянно. Отсюда следует что массивы я использовать не могу из-за нестатичности их размера. Использую двумерный список, но слабо представляю как вставлять в него значения по индексу?!?!? |
| Автор: wallstreet 26.7.2012, 10:01 | ||||
на самом деле немного не понял высказывание:
Если вы намекаете на
то это размер буфера, в который динамически льются данные, мне необходимо их распарсить и уже в нормальном виде вывести в отдельный список. Да обязательные атрибуты занимают ограниченное число байт, но сколько будут занимать данные, я не знаю. Так, на глаз, больше 200 конкретно в моей таблице еще не было, поэтому и поставил с запасом. |
| Автор: borisbn 26.7.2012, 13:11 |
нет. на то, что под тип данных в ячейке мелкомягкими отведено более одного байта слушай, а как ты выделяешь фон текста ? да ещё и в поле код ? |
| Автор: wallstreet 30.7.2012, 18:28 | ||||||||
| Благодарю за ссылку, многое для себя почрпнул. Вот на выходных решил переписать код на c++, который вы приводили в качестве примера на с# В принципе приложение компилируется, но при получении данных возникает вредная ошибка
Что это за ошибка и с чем ее едят я уже начитался от и до. Только вот найти не могу нулевой указатель в который якобы происходит попытка записи данных. С помощью breakpoint выследил построчно последнюю строку с которой ошибка не возникает. Если опустить точку брейка ниже на строку, ошибка появляется. Вот собственно код: ConnDecl.h
ConnRealization.cpp (участок коллбека, в котором обрабатываем сообщение об отправке нам данных)
реализация ParseXTbl()
наверняка наскрещивал слонов с носорогами и профи будут в "восторге" от увиденного, но сам никак не могу найти проблемный участок. Если кто свежим взглядом заметит, я буду признателен. |
| Автор: xvr 31.7.2012, 12:11 | ||||
Ошибки здесь:
Должно быть так:
|
| Автор: wallstreet 31.7.2012, 15:34 | ||||||
благодарю за участие в теме, но так, увы, не получится т.к. LPWSTR это wchar_t, а не char. А 2 байтный wchar_t никак использовать не могу. Сейчас поменял на:
вроде процесс пошел |
| Автор: xvr 31.7.2012, 20:43 | ||
Получится. Обратите внимание, там функция DdeQueryStringA, а не DdeQueryString А вот это работать не будет, т.к. DdeQueryString все равно будет выдавать на-гора Unicode, какой бы вы буфер ей не дали |
| Автор: wallstreet 31.7.2012, 23:38 | ||
сори, провтыкал |
| Автор: wallstreet 1.8.2012, 18:20 | ||||
| Для тех кому понадобится, выкладываю рабочий код. Заранее благодарю всех учувствующих в теме, большое спасибо
Не хватает обработки ошибок и еще по мелочи, а так, вроде бы все в порядке. |
| Автор: wallstreet 13.8.2012, 17:38 | ||||||
Если вы парсите данные, которые вам шлет торговый терминал Quik, то знайте, что тип данных tdtBlank в их протоколах передачи не предусмотрен. Индекс обновляемой строки (к примеру при импорте таблицы текущих параметров) ищите в HSZ2 обрабатывая сообщение XTYP_POKE:
в буфер bf мы получаем строку подобно этой: "R5C3:R15C3" (во второй части этой строки после ':') будет передаваться индекс обновляемой строки данных в передаваемой таблице. Парсю я ее так: Row
Cols
Кстати если кто знает способ быстрее обрабатывать строку и вытягивать кол-во строк и колонок, плз отметьте в этой ветке. |
| Автор: xvr 21.8.2012, 18:19 |
| Сложно найти способ менее эффективный |