LO Calc, открытие csv и форматы.

Автор ost, 21 сентября 2022, 21:58

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

ost

Доброго.
Прошу прощения за "обтекаемые" формулировки.
Как заставить LO Саlc отображать "как текст" числа с разрядностью >16 при загрузке файла формата .csv

mikekaganski

Выделите соответствующие столбцы в диалоге импорта и укажите их тип - текст.
С уважением,
Михаил Каганский

ost


ost

Файлы .csv формируются с использованием сторонних средств (python-модуля pandas). Задача сохранить их в формате .ods или на худой конец в .xls/.xlsx  так, чтобы, в частности, КБК сохранялись корректно.

mikekaganski

С уважением,
Михаил Каганский

greenman


economist

Цитата: ost от 21 сентября 2022, 22:23Файлы .csv формируются с использованием сторонних средств (python-модуля pandas). Задача сохранить их в формате .ods или на худой конец в .xls/.xlsx  так, чтобы, в частности, КБК сохранялись корректно.

C Pandas все подобное делается очень просто. Чтобы КБК не вы-Е-живался, превратите его в тип 'string':
df.кбк = df.кбк.astype('string')
df.to_excel('D:/df.ods')
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

economist

#7
Цитата: greenman от 22 сентября 2022, 11:36Вроде для этого есть openpyxl

Не совсем так. Там где речь о "преобразовании данных", а не о "форматировании данных" для CSV/TXT/XLS - Pandas и проще, и быстрее. Случай с превращением КБК в научное число 4232132132132E+223 - тот самый, нужно преобразование, точнее его предотвращение (по сути это добавление маркера текста ' - одинарной кавычки).

Но openpyxl тоже хорош, он позволяет делать другие, удивительные даже для мира Python, вещи:
- быстрая работа с файлом без открытия (как с zip-архивом)
- считывание отдельно формул или отдельно значений;
- замена и пере-вычисление простых формулы (не совсем честное, но все же);
- обновление именованных диапазонов;
- управление Усл-м и обычным Форматированием.

И все это в новых форматах xlsx/xlsm/xlsb, на PC без самого Excel. Скорость такого "хирургического" обновления данных в некоторых отчетах увеличило многократно, по сравнению с COM-генераций и всеми прочими метоlами. В паре с Pandas - openpyxl способен навести лоск в Excel-файле без Excel.

Но путь тернист, "форматирующий" макрорекордерный VBA-макрос в Excel/Calc может (и часто оказывается) проще в реализации.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

sokol92

#8
Цитата: ost от 21 сентября 2022, 22:05Нюанс, Файлов >16000
Важно не количество, а разнообразие.  :)
Можно ли как-то описать те поля в csv-файлах, которые не надо преобразовывать в числа?
Например, они имеют заголовок "КБК"? Еще какие-либо признаки?
Владимир.


ost

#10
Цитата: economist от 22 сентября 2022, 11:52C Pandas все подобное делается очень просто.
Попробую pandas, отпишусь о результате

add
Я уже пробовал применять astype. Сейчас уже не помню обстоятельств, в которых у меня этот самый astype "не взлетел". Попробую еще.

ost

#11
Цитата: sokol92 от 22 сентября 2022, 15:38Можно ли как-то описать

Конечно. Все csv-файлы имеют первой строкой заголовок, состоящий из полей с одно- многословным кириллическим текстом.

sokol92

Выложите пример csv-файла реальной структуры со строкой заголовка и несколькими (10-20) строками условных данных. Опишите, в каких столбцах Вас не устраивает результат стандартного импорта.
Владимир.

economist

#13
Если вопрос в (рекурсивном) переборе >16000 файлов, то для Python это тоже пустяк:
import pandas as pd
import glob
for f in glob.glob('D:/TXT/**/*.csv', recursive=True): # укажите свою TXT-папку. ** - означает любую подпапку
    df = pd.read_csv(f, sep=';') # или другой разделитель, например '\t' - табуляция (применяется в 1С) 
    df.КБК = df.КБК.astype('string') # если поле с КБК не "КБК" - укажите явно, например df['Код бюдж. класс.']
    df.to_excel(f[:-4]+'.ods') # сохраняем *.ods "рядом" с каждым *.csv

Чтобы все это было "не нужно" - просто добавьте строку df.КБК = df.КБК.astype('string') из #6 в ваш код, который делает первоначальное сохранение CSV, и ODS-файлы будут содержать полный не за-Е-шенный КБК.

Для работы Pandas с odf odt ods как с MSO doc?-, xls?-форматами - нужно один раз выполнить pip install odfpy Про установку pip в LO Python написано на Форуме в ветке про Pandas.

Кстати, для Pandas поле "КБК" в CSV-файле может находиться в любом месте таблицы. Для csv, скажем, из 1С - это актуально, юзеры часто там правят настройки отчетов. Сама 1С тоже "гадит": то вставляет, то удаляет пустые столбцы и строки в типовых отчетах, давая своим франчам повод заработать на "починке" отчетов у технически слабых пользователей.

Метод .astype('string') - "всеяден", он работает со всеми типами данных в колонках - числами, строками, булевым, списками итд. Важно не путать его с .astype(str), т.к. это другой, Python-тип, а не Pandas-тип. Они в общем-то совместимы, но не совсем. 
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...