CftClub.ru
Клуб специалистов ЦФТ-Банк

Загрузка из EXCEL

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
ReiAver
Участник


Вступление в Клуб: 12.05.2022
СообщениеПн Апр 08, 2024 23:47   Загрузка из EXCEL Ответить с цитатой
Полезность: Нет оценки
Добрый день.
Столкнулся с такой проблемой: загружаю из Excel в базу, для тестовой обработки есть файл на 100к записей.
Пока писал операцию отрезал у файла 1000 записей, чтобы быстрее грузилось и можно было ошибки отловить.
Операция грузит 1000 записей в базу и все работает нормально. Но при загрузке 100к возникла неожиданная ошибка. getSheetRowColVal не видит строк кроме сумм.
т.е в дебаг мне выводится: rec.Id_rec =null, rec.tsp = null, rec.summ = 123.00.
Я пишу из файла в структуру, делаю проверки значений , а потом пишу в базу.
Подскажите в чем может быть проблема?
pabrz
Участник со стажем


Вступление в Клуб: 27.09.2022
СообщениеВт Апр 09, 2024 01:53    Ответить с цитатой
Полезность: Нет оценки
1. Первое, что я бы рекомендовал, это перевести excel в csv и грузить в таком виде. Excel никогда хорошо не относился к файлам большого объема. На такой объем, это, как минимум, экономнее по ресурсам.

2. Для xlsx свойственно разные типы данных хранить в разных тэгах. И даже в разных файлах. Вам getSheetRowColVal не просто так предлагает ТИП ячейки указать.

Например,
число вы найдете в xl->worksheets->sheet1.xml
а строку в xl->SharedStrings.xml
(я же не открою для вас Америку, когда скажу что xlsx - это zip архив?)

Таким образом, если при формировании Excel формат данных колонки указан не того типа, или вы ищите не тот тип не по тому адресу, вы, разумеется, ничего не найдете.

А потому я возвращаю вас обратно к пункту 1, поскольку вторая причина - в csv у вас 1 файл и весь ваш труд - распарсить строку, разделенную ";".

3. Ну и если я вас таки не убедил, и вам все еще хочется делать импорт через excel, тогда остается только предложить вам проверить 100к записей, чтобы убедиться, что у вас везде указаны правильные типы и значение лежат в нужных местах. Потому что, как показывает практика, иногда даже установить тип для всей колонки не гарантирует того, что у вас на всех ячейках колонки тип сменится, ибо неисповедимы пути ms excel. Занавес. Smile
Эмиралька
Эксперт


Вступление в Клуб: 09.11.2015
СообщениеВт Апр 09, 2024 05:30   Re: Загрузка из EXCEL Ответить с цитатой
Полезность: Нет оценки
ReiAver пишет:
Добрый день.
Столкнулся с такой проблемой: загружаю из Excel в базу, для тестовой обработки есть файл на 100к записей.
Пока писал операцию отрезал у файла 1000 записей, чтобы быстрее грузилось и можно было ошибки отловить.
Операция грузит 1000 записей в базу и все работает нормально. Но при загрузке 100к возникла неожиданная ошибка. getSheetRowColVal не видит строк кроме сумм.
т.е в дебаг мне выводится: rec.Id_rec =null, rec.tsp = null, rec.summ = 123.00.
Я пишу из файла в структуру, делаю проверки значений , а потом пишу в базу.
Подскажите в чем может быть проблема?


А чем пользуетесь для разбора файла?
pabrz
Участник со стажем


Вступление в Клуб: 27.09.2022
СообщениеВт Апр 09, 2024 06:06    Ответить с цитатой
Полезность: Нет оценки
Там getSheetRowColVal указана. Это функция из семейства ooxml.
ReiAver
Участник


Вступление в Клуб: 12.05.2022
СообщениеВт Апр 09, 2024 06:40    Ответить с цитатой
Полезность: Нет оценки
Я пользуюсь getSheetRowColVal из библиотеки OOXML.
Меня смущает что и маленький файл(1000 строк) и большой (100к) это один и тот же файл, просто обрезанный.(т.е первые 1000 строк одинаковы в обоих файлах) Такое ощущение, что переполняется какая-то переменная.
pabrz
Участник со стажем


Вступление в Клуб: 27.09.2022
СообщениеВт Апр 09, 2024 06:50    Ответить с цитатой
Полезность: Нет оценки
Не исключено. Когда работает OOXML, она разбирает документ и раскладывает теги и т.п. по нескольким коллекциям (table of), но не все и не везде... В общем это довольно запутанная история, и у меня так и не хватило терпения весь этот модуль полностью расковырять.

В общем, большой файл - это почти всегда проблема. Причем создать его средствами OOXML проблема намного меньшая, чем прочитать.

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

Напрямую ограничения на количество строк я не видел, по крайней мере, когда последний раз там мимо проходил, и такого быть не должно. Я бы скорее поверил в лимит типа integer ~32 768, поскольку дефолтный index для коллекций имеет тип integer. Так что, сами понимаете, 100к это сильно больше. В общем, в тысячу мне не верится. Зато верится в баг самого Excel и MS.

Короче, самый простой выход - не страдать над этим багом, а просто вырулить через csv. Хотя, если у вас много времени и вы хотите пойти на принцип, то мне тоже будет интересно, что вы в итоге найдете. Smile


Последний раз редактировалось: pabrz (Вт Апр 09, 2024 07:04), всего редактировалось 1 раз
pabrz
Участник со стажем


Вступление в Клуб: 27.09.2022
СообщениеВт Апр 09, 2024 07:00    Ответить с цитатой
Полезность: Нет оценки
А, вспомнил, есть еще такая штука занятная...

Если вы делаете выгрузку в excel и, допустим, средствами MS установили для колонок типы данных, то эти типы могут не дойти до самого конца документа.
Да и вообще надо хорошо понимать, каким методом вы готовили свой документ, и какие типы для ячеек этот метод подготовки документа вам установил.

Аналогичная история иногда бывает с border. Там фокус в том, что может быть создан отдельный стиль для каждой ячейки, или отдельный стиль для каждой строчки, или отдельный стиль для каждого столбца, или один глобальный стиль.

И, соответственно, xml со стилями будет или супер огромный, или совсем маленький. И если он большой, то почти всегда бывают вопросы, да и скорость работы хромает.

Здесь может быть похожая история.
Volod
Эксперт


Вступление в Клуб: 19.09.2007
СообщениеВт Апр 09, 2024 09:06    Ответить с цитатой
Полезность: Нет оценки
Еще вариант - выделить непустые ячейки и скопировать в новый файл Excel.
ReiAver
Участник


Вступление в Клуб: 12.05.2022
СообщениеВт Апр 09, 2024 16:13    Ответить с цитатой
Полезность: Нет оценки
Коллеги, а в ЦФТ есть библиотека преобразования xls в CSV? Или надо самому писать?
pabrz
Участник со стажем


Вступление в Клуб: 27.09.2022
СообщениеСр Апр 10, 2024 03:51    Ответить с цитатой
Полезность: Нет оценки
А зачем вам писать? В Excel откройте документ и просто нажмите "сохранить как" и выбирайте вариант csv - ms-dos - самый безопасный.

Или вы хотите посредством файлов сделать автоматический обменник? Smile Это была бы не лучшая идея ))) Есть методы куда надежнее.
pabrz
Участник со стажем


Вступление в Клуб: 27.09.2022
СообщениеСр Апр 10, 2024 05:09    Ответить с цитатой
Полезность: Нет оценки
Volod пишет:
Еще вариант - выделить непустые ячейки и скопировать в новый файл Excel.


+1, кстати, да, может сработать. Хотя объем там конечно тот еще.
ReiAver
Участник


Вступление в Клуб: 12.05.2022
СообщениеСр Апр 10, 2024 11:55    Ответить с цитатой
Полезность: Нет оценки
Проблема в том что выделить из файла не пустые ячейки не получилось. Ибо по идее их выделять тем же getSheetRowColVal. А он при переполнении переменой blob в которую я читаю файл, говорит что всё колонки кроме num пустые. Я попытался сохранить в старом формате, но файл вырос в 2 раза и ЦФТ мне явно сказал, что переменная блоб переполнилась. Буду пробовать из csv загружать. У меня в связи с этим такой вопрос. При загрузке из CSV просто режут блоб на строки заданной длины. У CSV всегда заданная длина строки не зависимо от данных в ней? Те всё строки которые я вырежу из блоба будут 32767? Независимо от того будут там пустые колонки или нет?
Volod
Эксперт


Вступление в Клуб: 19.09.2007
СообщениеСр Апр 10, 2024 16:54    Ответить с цитатой
Полезность: Нет оценки
CSV - это строка с разделителями, она не фиксированной длины, но конечно, если она превысит 32к, чтение строки в ЦФТ сломается.
pabrz
Участник со стажем


Вступление в Клуб: 27.09.2022
СообщениеЧт Апр 11, 2024 02:10    Ответить с цитатой
Полезность: Нет оценки
Старый формат excel, если речь о *.xls документах, во-первых - больше по размеру, во-вторых - не предназначен для чтения его через ooxml.

Его конечно тоже в xml превратить можно, но там совсем другая идея - там один огромный xml файл со своей логикой.

Вообще при большом желании такой вариант тоже можно использовать - в смысле сохранить excel как xml и читать его уже средствами для xml, только это заметно сложнее, особенно если раньше такой ерундой не занимались, и писать такой импорт дольше. Кроме того, размер xml будет еще больше чем у csv.

Интересно, как вы blob смогли переполнить... там вроде порядка 4Гб размер. Боюсь спросить, сколько у вас файл весит.

Может быть имеет смысл его на куски порезать в таком случае? Что, кстати, тоже вариант. Наштамповать, скажем, 10-к файлов по 10к строк, и импортировать последовательно. Не так уж и много выйдет. Это же разовая акция, как я понимаю, так что такой вариант допустим.
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru