Введение

Я сделал этот инструмент по очень простой причине. Каждый раз делать это вручную было слишком утомительно.

CSV из внутренних систем, файлы из Excel, конфиги из Linux, Windows и баз данных. Как только меняется источник, меняются кодировка, окончания строк и наличие BOM.

  • Ожидаешь UTF-8, а там Shift_JIS
  • Ожидаешь LF, а там CRLF
  • Одним системам нужен BOM, другие с BOM ломаются

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


Главная боль — не один испорченный файл

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

И ещё сложнее то, что у каждой системы импорта своя «правильность».

  • Система A принимает только UTF-8 без BOM
  • Система B стабильнее с UTF-8 и BOM
  • Система C рассчитана на Shift_JIS; UTF-8 читается, но импорт падает

В такой ситуации общий совет «приведите всё к UTF-8» не работает. Нужна безопасная и воспроизводимая процедура под конкретный приёмник.


Что я хотел получить от этого инструмента

Три принципа:

  1. Принимать файлы из любого источника
  2. Преобразовывать под требования системы-назначения
  3. Не увеличивать число инцидентов при пакетной обработке

Это не демонстрация техники преобразования, а инструмент снижения операционного трения.


Процедура, которую я реально использую

1. Сначала фиксировать спецификацию выхода

Начинать нужно не с входа, а с выхода. Фиксируются три пункта:

  • Кодировка (UTF-8 / Shift_JIS и т.д.)
  • Окончания строк (LF / CRLF)
  • BOM (с / без)

Если здесь нет строгости, результат меняется вместе с исполнителем.

2. Делить объём на небольшие партии

Не запускать сразу весь объём. Разбивать по системе, периоду, типу файлов и начинать с малых батчей.

Причина простая: при ошибке можно откатиться. Полный one-shot быстрый только если всё прошло идеально.

3. Зафиксировать условия и делать пакетное преобразование

В конвертере кодировок задавать фиксированные параметры для каждой цели. Не менять их по ходу процесса. Ключевое — повторяемость.

4. Не считать визуальную проверку достаточной

«Открылось — значит нормально» часто ведёт к инциденту. Минимально нужно проверять:

  • Совпадает ли число строк до и после
  • Не «поехало» ли число столбцов CSV/TSV
  • Не увеличилось ли количество (replacement character)
  • Сохранились ли длина и тип символов в ключевых полях (ID/код)

Если проверка не пройдена, к импорту не переходить.


BOM — не вопрос веры, а вопрос требований приёмника

Споры «BOM нужен / не нужен» в эксплуатации мало полезны. Важно только то, как файл принимает система на той стороне.

  • Если с BOM стабильнее — отдавать с BOM
  • Если BOM ломает импорт — отдавать без BOM

Приоритет не «теоретически правильный формат», а «формат, который не ломает контрагента». Так работает практика.


Ценность инструмента — не в самом факте конвертации

Настоящая ценность в двух вещах:

  • Решения не зависят от конкретного человека
  • Снижается стоимость постоянных проверок

Инциденты кодировки нельзя обнулить полностью. Но можно перестать повторять один и тот же класс ошибок. Для этого и нужен инструмент, который принимает всё и возвращает результат, выровненный под задачу.


Итог

Этот инструмент создан не из идеалистической теории. Он создан, чтобы убрать постоянную рутину по «подкрутке кодировки» в реальной работе.

Принять файлы разного происхождения, выровнять кодировку, окончания строк и BOM под требования импорта и вернуть единообразный результат. Даже одна автоматизация этого потока заметно упрощает эксплуатацию.

Борьба с кракозябрами — не вопрос героизма. Это должна быть воспроизводимая процедура, где любой получает одинаковый результат. Только тогда можно говорить о безопасном массовом спасении файлов.