CSV (Comma-Separated Values) — один из самых распространённых форматов обмена табличными данными. Несмотря на кажущуюся простоту, CSV-файлы регулярно вызывают проблемы при импорте и обработке.
Что такое CSV и почему он ломается
CSV — текстовый формат, где каждая строка представляет запись, а поля разделены определённым символом. Формат настолько прост, что стандарт RFC 4180 был написан лишь в 2005 году — спустя десятилетия использования.
Основные причины, по которым CSV «ломается»:
- Неравное количество колонок — одни строки содержат 5 полей, другие 4
- Неправильная кодировка — файл в Windows-1251 открывается как кракозябры
- BOM (Byte Order Mark) — Excel добавляет невидимый символ в начало UTF-8 файла
- Неэкранированные запятые — поле с запятой не взято в кавычки
- Переносы строк внутри полей — поле содержит
\nбез кавычек
Разделители: когда что использовать
| Разделитель | Символ | Когда применяется |
|---|---|---|
| Запятая | , | Международный стандарт, API, JSON-подобные данные |
| Точка с запятой | ; | Excel в российской/европейской локали |
| TAB | \t | Данные с запятыми в полях, TSV-формат |
| Pipe | | | Данные, содержащие и запятые, и точки с запятой |
Проблема с Excel: в русскоязычной Windows Excel по умолчанию использует ; как разделитель, потому что , — разделитель дробной части числа. Из-за этого файл, корректный по международному стандарту, открывается в одну колонку.
Правила кавычек по RFC 4180
Стандарт RFC 4180 определяет обязательные правила экранирования:
- Поля, содержащие разделитель, кавычки или перенос строки, обязаны быть заключены в двойные кавычки
- Двойные кавычки внутри поля экранируются удвоением:
"" - Кавычки вокруг поля опциональны для полей без спецсимволов
# Корректный CSV
name,description,price
"Иванов, И.И.","Товар ""Особый""",1500.00
Петров П.П.,Обычный товар,750.00
# Ошибка — запятая внутри поля без кавычек
Иванов, И.И.,Товар,1500.00
Типичные проблемы CSV
Проблема 1: BOM в UTF-8 файлах
Excel при сохранении в UTF-8 добавляет BOM (\xEF\xBB\xBF) в начало файла. Это ломает импорт в программах, не ожидающих BOM.
Решение при чтении в Python:
import csv
with open('data.csv', encoding='utf-8-sig') as f: # utf-8-sig убирает BOM
reader = csv.reader(f)
Проблема 2: Неравное количество колонок
# Ошибочный файл
name,age,city
Иванов,30,Москва
Петров,25 ← только 2 поля вместо 3
Сидоров,40,Сочи,extra ← 4 поля вместо 3
Большинство парсеров выдадут ошибку или потеряют данные. Проверяйте файл перед импортом.
Проблема 3: Смешанные переносы строк
Разные операционные системы используют разные символы переноса строки:
- Windows:
\r\n(CRLF) - Unix/Linux:
\n(LF) - Старый Mac:
\r(CR)
RFC 4180 предписывает использовать \r\n, но на практике большинство парсеров принимают любой вариант.
Советы для создания надёжных CSV
- Всегда указывайте кодировку — UTF-8 без BOM универсальна для современных систем
- Используйте заголовок — первая строка с именами колонок предотвращает путаницу
- Квотируйте поля последовательно — либо все, либо только те, что содержат спецсимволы
- Проверяйте перед импортом — запустите через валидатор, чтобы не получить неожиданных результатов
- Документируйте разделитель — особенно если передаёте файл другим командам
Для конвертации CSV в структурированный JSON используйте CSV to JSON конвертер. Для работы с JSON-данными — JSON форматтер.
Инструмент на reChecker
CSV валидатор на reChecker проверяет структуру файла: равное количество полей в каждой строке, корректность кавычек, обнаруживает BOM и определяет используемый разделитель автоматически.