Добавил:
eipimru
У меня есть канал с приколами: t.me/urmipies_garbage Подпишитесь пж-пж!!!!
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:6 / csv_splitter
.pyimport csv
from openpyxl import Workbook
from openpyxl.styles import Border, Side
def process_csv_with_ladder_structure(csv_file_path, rows_per_sheet=50):
"""
Обрабатывает CSV файл с сохранением структуры 'лесенки' после начальных данных
"""
output_file_path = csv_file_path + ".xlsx"
csv_file_path = csv_file_path+".csv"
with open(csv_file_path, 'r', encoding='utf-8') as file:
csv_reader = csv.reader(file)
all_rows = list(csv_reader)
data_rows = [[]] + all_rows
# Создаем Excel файл
wb = Workbook()
wb.remove(wb.active)
# Разбиваем на листы
total_rows = len(data_rows)
sheet_count = (total_rows + rows_per_sheet - 1) // rows_per_sheet
print(f'#let caption = "{output_file_path}"')
for sheet_num in range(sheet_count):
print(f'''
#figure(
text(size: 13.5pt,
xlsx-parser(read("{output_file_path}", encoding: none), sheet-index: {sheet_num},
parse-table-style: false, parse-font: false,
inset: 1.6pt, stroke: 0.3pt, align: center)),
caption: caption)''')
start_row = max(sheet_num * rows_per_sheet - 1, 0)
end_row = min((sheet_num + 1) * rows_per_sheet, total_rows)
sheet_name = f"{sheet_num + 1}"
ws = wb.create_sheet(title=sheet_name)
# Записываем данные с сохранением структуры лесенки
current_sheet_rows = data_rows[start_row:end_row]
# Смещаем данные влево на каждом листе
shifted_rows = shift_data_left(current_sheet_rows)
# Записываем смещенные данные
for row_idx, row_data in enumerate(shifted_rows, 1):
for col_idx, value in enumerate(row_data, 1):
ws.cell(row=row_idx, column=col_idx, value=value)
# Применяем прямоугольные границы ко всему диапазону данных
apply_rectangular_borders(ws, shifted_rows)
wb.save(output_file_path)
def shift_data_left(rows):
"""
Смещает данные влево, убирая пустые столбцы слева
"""
if not rows:
return []
# Находим минимальный индекс непустого столбца среди всех строк
min_non_empty_col = float('inf')
for row in rows:
first_non_empty = None
for col_idx, cell in enumerate(row):
if cell and str(cell).strip():
first_non_empty = col_idx
break
if first_non_empty is not None and first_non_empty < min_non_empty_col:
min_non_empty_col = first_non_empty
# Если все строки пустые, возвращаем как есть
if min_non_empty_col == float('inf'):
return rows
# Смещаем все строки влево
shifted_rows = []
for row in rows:
if min_non_empty_col < len(row):
shifted_row = row[min_non_empty_col:]
else:
shifted_row = []
shifted_rows.append(shifted_row)
return shifted_rows
def apply_rectangular_borders(worksheet, data_rows):
"""
Применяет прямоугольные границы ко всему диапазону данных
"""
thin_border = Border(
left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin')
)
if not data_rows:
return
# Находим размеры прямоугольной области
max_cols = max(len(row) for row in data_rows) if data_rows else 0
max_rows = len(data_rows)
# Применяем границы ко всей прямоугольной области
for row in range(1, max_rows + 1):
for col in range(1, max_cols + 1):
cell = worksheet.cell(row=row, column=col)
cell.border = thin_border
if __name__ == "__main__":
process_csv_with_ladder_structure("data/crc16")
process_csv_with_ladder_structure("data/crc16_check")
process_csv_with_ladder_structure("data/crc32")
process_csv_with_ladder_structure("data/crc32_check")
Соседние файлы в папке 6
