Добавил:
У меня есть канал с приколами: t.me/urmipies_garbage Подпишитесь пж-пж!!!! Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

6 / csv_splitter

.py
Скачиваний:
0
Добавлен:
02.09.2026
Размер:
4 Кб
Скачать
import 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