объединение двух файлов

Автор Jokersun90, 20 января 2020, 11:15

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

Jokersun90

Здравствуйте уважаемые форумчане!  :beer:
Сегодня столкнулся с проблемой объединения двух файлов в calc с удалением одинаковых строк  ???
Суть задачи состоит в том что интегрировать один список в другой но так что одинаковые строки не копировались :roll:
Например есть документ А и документ Б ,в них есть списки доменов .В списке Б есть домены которые могут повторятся с теми что в списке А,но мне этого не надо. Да,можно использовать поиск и проверять в ручную,но в этих списках примерно по 9к строк  >:D а в день может проверяться около 10 таких списко :roll:
Может кто знает как автоматизировать этот процесс?  :'(

rami

Посмотрите тему Удалить дубликаты, там в первом посте есть ссылка на сайт с расширением.

Были и другие подобные темы.

economist

Цитата: Jokersun90 от 20 января 2020, 11:15можно использовать поиск и проверять в ручную,но в этих списках примерно по 9к строк  Злой а в день может проверяться около 10 таких списко

Это уже с серьезные объемы для анализа и вопрос выбора инструмента. Призываю рассмотреть все вар-ты. Лаконично и быстро это сделает язык Python (файл с расширением .py):


import pandas as pd
a=pd.read_csv(путькфайлу_a)
b=pd.read_csv(путькфайлу_b)
a=a.concat(b)
a.drop_duplicates(inplace=True)
a.to_csv(путькфайлу_с)


Обратите внимание - насколько понятен этот незнакомый код. Запустить такой файл можно со свободным языком Python или тем питоном, что есть "под капотом" в OpenOffice|LibreOffice (файл python.exe внутри офиса)
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Jokersun90

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

ArsKam

Цитата: economist от 20 января 2020, 12:52import pandas as pd
a=pd.read_csv(путькфайлу_a)
b=pd.read_csv(путькфайлу_b)
a=a.concat(b)
a.drop_duplicates(inplace=True)
a.to_csv(путькфайлу_с)
Здравствуйте!
А можно, наверное, и определённый диапазон (не именованный) с нескольких однотипных ods-файлов так объединить?

economist

Да, можно, и для большого числа файлов даже нужно, т.к. Pandas сделает все быстро. Она читает txt/csv/ods/xls (200+ форматов) и легко жонглирует таблицами в памяти (df-датафреймами), позволяя как угодно совмещать данные:

pd.concat - пристыковывет снизу/сбоку "одинаковые" df, например, выгруженные проводки за разные периоды
pd.merge - обогащает один df данными другого df, с другой структурой. Таблица толстеет, становится шире.
pd.join - обогащает один df данными из другого на основе индексов в SQL JOIN-стиле
pd.append - устарел. Это упрощенный concat, можно встретить в чужих примерах


Огромное количество "граблей имени Excel" (например при соединении данных с функциями ВПР/VLOOKUP, (ИНДЕКС+ПОИСКПОЗ) или СУММЕСЛИ - Pandas хорошо знает и предупредит вас. Например, если к таблице Окладов вы по ФИО добавляете суммы из таблицы Премий - Excel/Calc сделают "подставу" в случае полных однофамильцев (по статистике их 5 пар на 1 тыс). Т.е. вернет или "завышенные", или "первые" или "последние" данные.   

А Pandas при pd.merge - проверит "отношения" при объединении: 1:1, 1:m, m:1, m:m (m - многие) и даст сообщение об ошибке. Формулами воротить такую же проверку в Excel/Calc - громоздко. Оттого и появился PowerQuery (и он во многом копирует идеи из Pandas, а тот, в свою очередь, подражал Matlab/R).

Если же задача просто пристыковать диапазоны из похожих файлов Calc с одинаковым заголовком в 5-й строке, то вот простое решение, которое "не умрет" даже на миллионах строк:
import glob
import pandas as pd
df = pd.DataFrame()
for f in glob.glob('C:/ТЕСТ/*.ods'):
    df = pd.concat([df, pd.read_excel(f, skiprows=4)], axis=0)
df.to_excel('C:/out.ods')
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

ArsKam

Лепота👍🏻🤝🏻
Спасибо! Буду пробовать!

economist

#7
см. вложение - распакуйте в ...\libreoffice\share\Scripts\python\ если будете запускать из LO (установить Pandas).

Если установить обычный Python, скажем в C:\Python (c флагом Add Path) - тогда вложение можно распаковать куда угодно, запускаться будет C:\Python\python.exe

SyntaxError: invalid чаще всего дают невидимые символы в py-файле - табуляция/пробелы итп. В моем примере выше ошибки нет. Возможно у вас при вставке кода что-то случилось (например добавился символ табуляции).

Для работы с Python (и 100+ др. языками программирования) можно поставить самую популярную free/свободную IDE Visual Studio Code или Codium (близнецы). В них есть режим "блокнотов" (notebook), который позволяет создавать скрипт по кусочкам, в ячейках. При выполнении каждой ячейки - значения переменных не обнуляются, а висят в памяти. Это упрощает программирование кратно.

При правке, вставке, импорте кода отовсюду - IDE сама следит за синтаксисом, отступами, стилем кода с помощью т.н. линтеров. Плюс там "просто красиво". 
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

mikekaganski

Обратный слэш в строке Python должен дублироваться.
С уважением,
Михаил Каганский

economist

Цитата: ArsKam от 13 января 2023, 19:57df.to_excel('C:\Users\test.ods')
Верно заметил @mikekaganski, ошибка была из-за обратного слеша.

Три правильных варианта написания путей под Windows в py-скриптах Python:
r'C:\Users\test.ods'  # r'' означает что строка воспринимается как RAW-"сырая"
'C:\\Users\\test.ods' # два обр. слеша означают де-факто один
'C:/Users/test.ods'   # можно использовать прямой слеш

Кстати, размещать вручную пользовательские файлы в корне папки C:\Users не стоит - там работает служба UAC, могут быть какие угодно "фокусы". Но можно класть файл внутрь папки пользователя типа C:\Users\<USERNAME>\

PS Всегда проще чужой код не переписывать, а запустить "как есть", воссоздав пути у себя. Времени на поиск проблем уйдет меньше, т.к. будет ясно что код был рабочий, а ошибка появилась после вашей замены 'C:/ТЕСТ/*.ods' на 'C:\Users\test.ods'
 
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

ArsKam

#10
А ещё может нужно добавить
pip install odfpy и в скрипт
import odf ?

economist

Утилиты вида pip install <libname> предназначены не для скриптов, а для запуска  интерактивно, в Консоли, чтобы пользователь видел их вывод (ошибки, предупреждения итп) и реагировал. Скрипты *.py могут сами налету ставить отсутствующие библиотеки (так делают DS-среды типа Google Colab). Но это нерационально, т.к. запуск такого скрипта будет "дерганым". Поэтому совмещать не надо: сначала (один раз) установите все нужные библиотеки, а затем запускайте скрипты. Установка зависит от "способа" использования Python: 

Для пользователей офисных пакетов и ODF-форматов есть 2 способа использовать Python:
- "встроенный" (урезанный) в OpenOffice|LibreOffice интерпретатор Python
- "внешний" (полноценный) интерпретатор Python (офисный пакет вообще не обязателен)

Способы по-разному позволяют:
- ставить библиотеки (см. https://forumooo.ru/index.php?topic=8696.0)
- вызывать/хранить скрипты
- отлаживать скрипты
- обрабатывать содержимое ODF-файлов (изнутри и снаружи)
- интегрироваться с остальной Basic/API-автоматизацией OpenOffice|LibreOffice

Но способы можно и нужно комбинировать, беря лучшее из двух миров. Можно сказать что комбинирование неизбежно.

"Урезанный" Питон не требует прав администратора, но требует ручных действий, некоторые библиотеки в нем не поставятся. Зато он бесшовно интегрируется в OpenOffice|LibreOffice, вплоть до хранения скрипта внутри ODF-файлов. Можно в portable OpenOffice|LibreOffice заранее поставить нужные либы и тем самым создать одинаковую среду для сотен и тысяч офисных компьютеров, потратив всего час, не будучи администратором PC и домена.

"Внешний" Питон - мощнее, все либы в нем работают и ставятся влёт. Но это отдельная среда. Навсегда обеспечить ее одинаковость в большой растущей конторе - сложная и дорогая задача для администратора домена, которая займет у него человеко-недели в год. Вот почему у "урезанного" способа шансов на реализацию больше - урезанных питонов в РФ ~60 млн. (по числу OpenOffice|LibreOffice), а внешних питонов всего около 4 млн.   

Все это очень похоже на ситуацию с VBA и VB (первый "живет" только внутри MSO, CorelDraw, AutoCAD итд, а второй - только сам по себе, как отдельное приложение). Первый не может создавать самостоятельные exe-приложения, второй - только для этого и предназначен. Первый "ближе к народу" и потому есть у всех, второй - только для True-программистов.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

ost

Цитата: economist от 14 января 2023, 20:46написания путей

[/quote]

На этот случай есть шикарная python-библиотека pathlib.
Здесь https://miguendes.me/python-pathlib#what-is-pathlib-in-python красочный рецептурный сборник.
pathlib, кстати, имеется в питоне из поставки libreoffice.

economist

Проверьте что в VSCodium и его терминале выбрался тот Питон (LO-шный).
SO советует в нем заранее сделать pip install odfpy и проверить import odfpy
Вы всегда можете переписать df.to_excel('C:/out.ods') на df.to_excel('C:/out.xlsx')
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

ArsKam

#14
На
Цитата: economist от 26 января 2023, 08:34сделать pip install odfpy
Получил:
Requirement already satisfied: odfpy in c:\users\kamals\appdata\local\programs\python\python38-32\lib\site-packages (1.4.1)
Requirement already satisfied: defusedxml in c:\users\kamals\appdata\local\programs\python\python38-32\lib\site-packages
(from odfpy) (0.7.1)
Потом выполнил
python -m pip install pip --upgradeи далее
pip install pyinstaller --upgradeНо не помогло 🤷