Коллеги, добрый день!
Заказчик предоставляет бинарный .xlsb замысловатого вида. Файл в аттачах.
Пишем:
ODBC CONNECT32 TO [Excel Files;DBQ=...\FileName.xlsb];
SQL SELECT * FROM `...\FileName.xlsb`.`Реестр$;
Как корректно выгрузить данные, где только 9 строка -- заглавие.
Привет.
В этом случае можно поступить следующим образом:
- загрузить все данные с использование предшествующего load c добавлением колонки = номер строки rowno() As RowID.
LOAD rowno() as RowId, *;
SQL SELECT * FROM `C:\Users\123\Documents\тест.xlsb`.`Лист1$`;
Затем уже обработать полученную таблицу привычными способами.
Возможно, возникнет проблема с названием колонок, т.к. имена присваиваются по первому значению в колонке. Но для этого случая тоже есть решение.
Спасибо, будем посмотреть.
Цитата: 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.
Я кликвьювер не-настоящий, поэтому могу примитивных вещей не понимать.
Сначала загрузите все строки, добавьте номер строки.
Затем, уже после просмотра результата сформируйте условие для обрезки заголовка.
Цитата: admin от 11 декабря 2017, 01:15:26
Затем, уже после просмотра результата сформируйте условие для обрезки заголовка.
Т.е., гружу sql_table: SQL SELECT,
затем пишу привычное
table1:
load *
resident sql_table
where rowid > 8;
table1 не формируется под действием неведомых сил.
При загрузке из бинарника не используйте никаких условий.
Результат есть?
Заголовок в таблице в 9 строке, но при загрузке первой строкой будет строка в которой появится первое значение в любой колонке.
Цитата: admin от 11 декабря 2017, 01:42:50
При загрузке из бинарника не используйте никаких условий.
Результат есть?
Да, гружу бинарник безусловно.
Результирующая таблица Table1, понятно, содержит "не те" поля.
ОК.
Затем гружу буферный Table2 LOAD * RESIDENT Table1 WHERE RowId > 8;, в котором провожу выборку записей по интересующий нас заголовок. Затем гружу уже итоговую таблицу со всеми наворотами, сборка проходит без ошибок, но итоговой таблицы нет. Возможно можно обойтись и БЕЗ буфера Table2, но тогда поля определяются -- как несуществующие.
Цитата: admin от 11 декабря 2017, 01:42:50
Заголовок в таблице в 9 строке, но при загрузке первой строкой будет строка в которой появится первое значение в любой колонке.
Это первая строка.
Пример файла импорта.
t1:
LOAD RowNo() as RowId,*;
SQL SELECT *
FROM "Реестр$";
t2:
NoConcatenate
load * Resident t1 where RowId>8;
DROP Table t1;
Так он верно собирает данные, но в качестве заголовков тянет первые NOTNULL-значения. Как это победить?
Ну если названия не будут меняться можно и просто вручную переименовать при загрузке.
Если же часть выше заголовка ненадежна можно выгрузить таблицу в 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) добиться желаемого результата.
Решал задачу по загрузке данных из сложного формата с сотнями колонок, с транспонированием и формированием заголовков. Исходника у меня не осталось, но помню что код получился компактным и не сильно сложным.
Store Into CSV позволяет задать нужные заголовки.
Единственное, при подключении теряются ~700 полей -- большой файл :) :).
то есть теряются? бинарник не отдает все колонки?
Конвертируйте в открытый формат.
То есть -- конвертируйте? Отказаться от бинарника?
Поля теряются при подключении.
Бинарник - закрытый формат.
Цель его использования вместо xlsx, xlsm ? Наверняка из-за проблем с количеством данных и скоростью работы.
Если ODBC не получает всю информацию из этого формата ( не клик, а ODBC!) то надо искать другие варианты. Как вариант - пересмотр задачи на уровень выше, а именно на этапе формирования массива исходных данных.
Согласен, но так вопрос не стоит :).