Неофициальный форум пользователей Qlik Sense & Qlikview

Для разработчиков => Вопросы по Qlik Sense & QlikView => Тема начата: AdoreuLogy от 08 декабря 2017, 08:21:21

Название: how to change header row with ODBC (xlsb binary-file)
Отправлено: AdoreuLogy от 08 декабря 2017, 08:21:21
Коллеги, добрый день!

Заказчик предоставляет бинарный .xlsb замысловатого вида. Файл в аттачах.

Пишем:
ODBC CONNECT32 TO [Excel Files;DBQ=...\FileName.xlsb];
SQL SELECT * FROM `...\FileName.xlsb`.`Реестр$;
Как корректно выгрузить данные, где только 9 строка -- заглавие.
Название: Re: how to change header row with ODBC (xlsb binary-file)
Отправлено: admin от 09 декабря 2017, 11:17:33
Привет.

В этом случае можно поступить следующим образом:
- загрузить все данные с использование предшествующего load c добавлением колонки = номер строки rowno() As RowID.
LOAD rowno() as RowId, *;
SQL SELECT * FROM `C:\Users\123\Documents\тест.xlsb`.`Лист1$`;


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

Название: Re: how to change header row with ODBC (xlsb binary-file)
Отправлено: AdoreuLogy от 09 декабря 2017, 06:13:09
Спасибо, будем посмотреть.
Название: Re: how to change header row with ODBC (xlsb binary-file)
Отправлено: AdoreuLogy от 11 декабря 2017, 01:07:06
Цитата: admin от 09 декабря  2017, 11:17:33  
rowno() As RowID.
LOAD rowno() as RowId, *;
SQL SELECT * FROM `C:\Users\123\Documents\тест.xlsb`.`Лист1$`;


Так, пишу предшествующий лоад, гружу
SQL SELECT * FROM WHERE RowId > 8;
Возвращает типичное:
> SQL##f - SqlState: 07001, ErrorCode: 4294964286, ErrorMsg: [Microsoft][Драйвер ODBC Excel] Слишком мало параметров. Требуется 1.

Я кликвьювер не-настоящий, поэтому могу примитивных вещей не понимать.
Название: Re: how to change header row with ODBC (xlsb binary-file)
Отправлено: admin от 11 декабря 2017, 01:15:26
Сначала загрузите все строки, добавьте номер строки.
Затем, уже после просмотра результата сформируйте условие для обрезки заголовка.
Название: Re: how to change header row with ODBC (xlsb binary-file)
Отправлено: AdoreuLogy от 11 декабря 2017, 01:39:30
Цитата: admin от 11 декабря  2017, 01:15:26  
Затем, уже после просмотра результата сформируйте условие для обрезки заголовка.
Т.е., гружу sql_table: SQL SELECT,
затем пишу привычное
table1:
load *
resident sql_table
where rowid > 8;

table1 не формируется под действием неведомых сил.
Название: Re: how to change header row with ODBC (xlsb binary-file)
Отправлено: admin от 11 декабря 2017, 01:42:50
При загрузке из бинарника не используйте никаких условий.
Результат есть?
Заголовок в таблице в 9 строке, но при загрузке первой строкой будет строка в которой появится первое значение в любой колонке.
Название: Re: how to change header row with ODBC (xlsb binary-file)
Отправлено: AdoreuLogy от 11 декабря 2017, 02:11:34
Цитата: admin от 11 декабря  2017, 01:42:50  
При загрузке из бинарника не используйте никаких условий.
Результат есть?

Да, гружу бинарник безусловно.
Результирующая таблица Table1, понятно, содержит "не те" поля.
ОК.
Затем гружу буферный Table2 LOAD * RESIDENT Table1 WHERE RowId > 8;, в котором провожу выборку записей по интересующий нас заголовок. Затем гружу уже итоговую таблицу со всеми наворотами, сборка проходит без ошибок, но итоговой таблицы нет. Возможно можно обойтись и БЕЗ буфера Table2, но тогда поля определяются -- как несуществующие.

Цитата: admin от 11 декабря  2017, 01:42:50  
Заголовок в таблице в 9 строке, но при загрузке первой строкой будет строка в которой появится первое значение в любой колонке.
Это первая строка.
Название: Re: how to change header row with ODBC (xlsb binary-file)
Отправлено: AdoreuLogy от 11 декабря 2017, 03:22:55
Пример файла импорта.
Название: Re: how to change header row with ODBC (xlsb binary-file)
Отправлено: admin от 11 декабря 2017, 03:37:49

t1:
LOAD RowNo() as RowId,*;
SQL SELECT *
FROM "Реестр$";
t2:
NoConcatenate
load * Resident t1 where RowId>8;
DROP Table t1;
Название: Re: how to change header row with ODBC (xlsb binary-file)
Отправлено: AdoreuLogy от 11 декабря 2017, 04:20:31
Так он верно собирает данные, но в качестве заголовков тянет первые NOTNULL-значения. Как это победить?
Название: Re: how to change header row with ODBC (xlsb binary-file)
Отправлено: admin от 11 декабря 2017, 08:11:05
Ну если названия не будут меняться можно и просто вручную переименовать при загрузке.
Если же часть выше заголовка ненадежна можно выгрузить таблицу в qvd-файл, и используя Функции файлов (https://help.qlik.com/ru-RU/qlikview/12.1/Subsystems/Client/Content/Scripting/FileFunctions/QvdFieldName.htm)
, циклы и операторы скрипта (https://help.qlik.com/ru-RU/qlikview/12.1/Subsystems/Client/Content/Scripting/ScriptRegularStatements/rename-field.htm) добиться желаемого результата.

Решал задачу по загрузке данных из сложного формата с сотнями колонок, с транспонированием и формированием заголовков. Исходника у меня не осталось, но помню что код получился компактным и не сильно сложным.
Название: Re: how to change header row with ODBC (xlsb binary-file)
Отправлено: AdoreuLogy от 12 декабря 2017, 07:54:49
Store Into CSV позволяет задать нужные заголовки.
Единственное, при подключении теряются ~700 полей -- большой файл  :) :).
Название: Re: how to change header row with ODBC (xlsb binary-file)
Отправлено: admin от 12 декабря 2017, 08:55:21
то есть теряются? бинарник не отдает все колонки?
Конвертируйте в открытый формат.
Название: Re: how to change header row with ODBC (xlsb binary-file)
Отправлено: AdoreuLogy от 13 декабря 2017, 10:52:09
То есть -- конвертируйте? Отказаться от бинарника?
Поля теряются при подключении.
Название: Re: how to change header row with ODBC (xlsb binary-file)
Отправлено: admin от 13 декабря 2017, 11:20:40
Бинарник - закрытый формат.
Цель его использования вместо xlsx, xlsm ? Наверняка из-за проблем с количеством данных и скоростью работы.
Если ODBC не получает всю информацию из этого формата ( не клик, а ODBC!) то надо искать другие варианты. Как вариант - пересмотр задачи на уровень выше, а именно на этапе формирования массива исходных данных.
Название: Re: how to change header row with ODBC (xlsb binary-file)
Отправлено: AdoreuLogy от 13 декабря 2017, 11:35:34
Согласен, но так вопрос не стоит :).