Нужен совет

Автор Unycom, 25 февраля 2023, 13:47

0 Пользователи и 1 гость просматривают эту тему.

Unycom

Добрый день! Нужен совет. Есть таблица с 10ю листами по 50 тысяч строк. С этой таблицы парсятся данные методом  ВПР (VLOOKUP).
Чтобы не зависало, пришлось создать 10 отдельных таблиц, что увеличило время работы.
Что можно придумать, чтобы процесс был быстрым, не зависал и тд.
Может базу разместить на сервере?

sokol92

Не зная конкретики, трудно давать советы.
Простое правило: если Вы ищете по большой таблице - отсортируйте ее по ключу поиска и используйте VLOOKUP (или аналогичную функцию) в режиме поиска по отсортированному массиву. При этом в формуле, скорее всего, придется проверить, что найденный ключ равен исходному.
В базах данных в аналогичных ситуациях создают индексы для поиска.
Владимир.

economist

Скрипт на Python прост и быстр для таких задач:
import pandas as pd     # загрузили библиотеку Pandas, см. Форум
out = pd.DataFrame()    # создали пустую таблицу
for n in range(0,10):   # цикл для 1-10 листов
    sheet = pd.read_excel('D://10sheets50k.ods', sheet_name=n) # считали лист
    out = pd.concat([out, sheet], axis=0)                      # соединили     
out.query(' Код==5').to_excel('D://out.ods')  # сделали ВПР и сохр в ODS-файл

Метод query(' Код==5') - это аналог =ВПР(5;'Лист1-10!A1:B500000;2;ЛОЖЬ)
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Unycom

Цитата: economist от 25 февраля 2023, 17:15Скрипт на Python прост и быстр для таких задач:
import pandas as pd     # загрузили библиотеку Pandas, см. Форум
out = pd.DataFrame()    # создали пустую таблицу
for n in range(0,10):   # цикл для 1-10 листов
    sheet = pd.read_excel('D://10sheets50k.ods', sheet_name=n) # считали лист
    out = pd.concat([out, sheet], axis=0)                      # соединили     
out.query(' Код==5').to_excel('D://out.ods')  # сделали ВПР и сохр в ODS-файл

Метод query(' Код==5') - это аналог =ВПР(5;'Лист1-10!A1:B500000;2;ЛОЖЬ)

Спасибо за помощь! А как запускать код?

economist

1. Ставим Python c флагом Add Path отсюда https://www.python.org/downloads/windows/ обратив внимание на ОС. лучше ставить 3.8.10-3.8.16 (ближе к LO)
2. Win+R затем cmd + Enter
3. install pip pandas odfpy
4. Скачать файл скрипта sheets_concater.py (распаковать 7z куда угодно)
5. Запустить sheets_concater.py проверить что out.txt обновился

Для запуска с вашим данными:
1. Поправить имена файлов/пути в скрипте на свои, вместо \ используйте //
2. Исправить .query(" Код==5 ") на то что вам нужно. Это очень мощный инструмент поиска точных, неточных, re-выражений во всей таблице. Возвращает строки таблицы, соответствующие условию.
3. Запустить sheets_concater.py со своими данными, проверить out.ods
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

kompilainenn

Цитата: Unycom от 25 февраля 2023, 13:47Есть таблица с 10ю листами по 50 тысяч строк. С этой таблицы парсятся данные методом  ВПР (VLOOKUP).
Версия офиса какая?
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

Unycom

Цитата: economist от 25 февраля 2023, 19:291. Ставим Python c флагом Add Path отсюда https://www.python.org/downloads/windows/ обратив внимание на ОС. лучше ставить 3.8.10-3.8.16 (ближе к LO)
2. Win+R затем cmd + Enter
3. install pip pandas odfpy
4. Скачать файл скрипта sheets_concater.py (распаковать 7z куда угодно)
5. Запустить sheets_concater.py проверить что out.txt обновился

Для запуска с вашим данными:
1. Поправить имена файлов/пути в скрипте на свои, вместо \ используйте //
2. Исправить .query(" Код==5 ") на то что вам нужно. Это очень мощный инструмент поиска точных, неточных, re-выражений во всей таблице. Возвращает строки таблицы, соответствующие условию.
3. Запустить sheets_concater.py со своими данными, проверить out.ods

Получилось, спасибо!
А если нужно более 1го результата?
Например, код1, код5

Unycom

Цитата: kompilainenn от 25 февраля 2023, 19:51
Цитата: Unycom от 25 февраля 2023, 13:47Есть таблица с 10ю листами по 50 тысяч строк. С этой таблицы парсятся данные методом  ВПР (VLOOKUP).
Версия офиса какая?

7.5.0.3 64

economist

Цитата: Unycom от 25 февраля 2023, 20:32А если нужно более 1го результата?
Например, код1, код5

out.query(" Код==1 or Код==5 ")
out.query(" Код.isin([1, 5]) ") # или так

Если нужно найти по части строки, то:
out.query(" Товар.str.contains('подшипник', case=False) ") 
query() - это один из 7-ми способов выборки данных, не самый быстрый, но в 3-ке лучших. Быстрее индексация и логическая индексация (с изменением структуры данных). Скорее всего вы на своих данных получите ускорение с ~30 до ~2 секунд. 2 сек. можно уменьшить еще в 4 раза, но разница уже не такая существенная. 

Имхо, связка Pandas+Сalc наиболее эффективна если сложные/большие вычисления/преобразования делать в Pandas, а очищенные данные (и разумные по объему тыс./дес. тыс. строк) - отдавать в Calc, и там привычно делать сводные, графики итд.

В Calc можно эффективно и быстро загружать большие объемы упорядоченных, проиндексированных "чистых данных" (CSV/ODS) - штатными методами (связями, ссылками), макросом c методом doImport или "транзитом" из Base (Ctrl+Shift+F4).

Если же делать "чистку" в Calc традиционно, через Ctrl+H и формулами вида =ЛЕВСИМВ(ДВССЫЛ(ИНДЕКС(ПОИСКПОЗ(ПСТР)))) - на тысячах строк это будет медленно. Лучшее из двух миров - вот способ делать работу в 4 раза легче и быстрее.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

kompilainenn

Цитата: Unycom от 25 февраля 2023, 20:337.5.0.3 64
а файликом можете поделиться? мне интересен вопрос производительности ВПР
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут