how to change header row with ODBC (xlsb binary-file)

Автор AdoreuLogy, 08 декабря 2017, 08:21:21

« назад - далее »

AdoreuLogy

Коллеги, добрый день!

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

Пишем:
ODBC CONNECT32 TO [Excel Files;DBQ=...\FileName.xlsb];
SQL SELECT * FROM `...\FileName.xlsb`.`Реестр$;
Как корректно выгрузить данные, где только 9 строка -- заглавие.

admin

Привет.

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


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


AdoreuLogy


AdoreuLogy

Цитата: 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

Сначала загрузите все строки, добавьте номер строки.
Затем, уже после просмотра результата сформируйте условие для обрезки заголовка.

AdoreuLogy

Цитата: admin от 11 декабря  2017, 01:15:26  
Затем, уже после просмотра результата сформируйте условие для обрезки заголовка.
Т.е., гружу sql_table: SQL SELECT,
затем пишу привычное
table1:
load *
resident sql_table
where rowid > 8;

table1 не формируется под действием неведомых сил.

admin

При загрузке из бинарника не используйте никаких условий.
Результат есть?
Заголовок в таблице в 9 строке, но при загрузке первой строкой будет строка в которой появится первое значение в любой колонке.

AdoreuLogy

Цитата: admin от 11 декабря  2017, 01:42:50  
При загрузке из бинарника не используйте никаких условий.
Результат есть?

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

Цитата: admin от 11 декабря  2017, 01:42:50  
Заголовок в таблице в 9 строке, но при загрузке первой строкой будет строка в которой появится первое значение в любой колонке.
Это первая строка.

AdoreuLogy


admin


t1:
LOAD RowNo() as RowId,*;
SQL SELECT *
FROM "Реестр$";
t2:
NoConcatenate
load * Resident t1 where RowId>8;
DROP Table t1;

AdoreuLogy

#10
Так он верно собирает данные, но в качестве заголовков тянет первые NOTNULL-значения. Как это победить?

admin

#11
Ну если названия не будут меняться можно и просто вручную переименовать при загрузке.
Если же часть выше заголовка ненадежна можно выгрузить таблицу в qvd-файл, и используя Функции файлов
, циклы и операторы скрипта добиться желаемого результата.

Решал задачу по загрузке данных из сложного формата с сотнями колонок, с транспонированием и формированием заголовков. Исходника у меня не осталось, но помню что код получился компактным и не сильно сложным.

AdoreuLogy

Store Into CSV позволяет задать нужные заголовки.
Единственное, при подключении теряются ~700 полей -- большой файл  :) :).

admin

то есть теряются? бинарник не отдает все колонки?
Конвертируйте в открытый формат.

AdoreuLogy

То есть -- конвертируйте? Отказаться от бинарника?
Поля теряются при подключении.

Яндекс.Метрика