1. Формат CSV: структура, разделители, локали и кодировки
Формат CSV: структура, разделители, локали и кодировки
Зачем разбираться в формате CSV
CSV (Comma-Separated Values) часто называют простым форматом. На практике большинство ошибок при экспорте CSV в C# появляются не из-за записи файлов, а из-за деталей:Эта статья задаёт основу для следующих материалов курса: дальше мы будем писать CSV в C#, но сначала важно договориться о правилах.
Что такое CSV
CSV — это текстовый файл, где:Наиболее известное описание формата — RFC 4180. Оно не покрывает все реальные вариации, но задаёт понятный базовый ориентир.
Ссылка: RFC 4180 (CSV File Format)
Структура CSV
Строки и записи
Обычно:Практические нюансы:
\r\n\nЗаголовок (header)
Часто первая строка содержит названия колонок:Id,Name,SalaryЭто не обязательная часть формата, но почти всегда полезная.
Поля (values)
Внутри строки значения идут последовательно и разделяются выбранным разделителем.Пример (разделитель запятая):
Разделители: запятая, точка с запятой, таб
Почему CSV не всегда про запятую
Хотя в названии есть Comma, во многих локалях запятая используется как десятичный разделитель в числах. Поэтому, например, в русскоязычной среде распространён разделитель;.Типичные варианты разделителя:
, запятая; точка с запятой\t табуляция (часто называют TSV)Как выбрать разделитель
Выбор зависит от того, кто будет открывать файл:; для русской локали и , для англоязычнойВстроенный в Windows разделитель списка
На Windows есть настройка List separator (разделитель списка), которую Excel часто учитывает при открытии CSV.Вывод:
Кавычки и экранирование
Когда нужно заключать поле в кавычки
Распространённое правило (в том числе из RFC 4180): поле нужно заключать в двойные кавычки"...", если внутри есть:;)Пример (разделитель запятая):
Как экранировать двойную кавычку внутри значения
В CSV двойная кавычка внутри кавычечного поля экранируется удвоением.Значение:
Он сказал "Привет"В CSV внутри кавычек:
"Он сказал ""Привет"""!Наглядно показывает, когда нужны кавычки и как удваивать кавычки внутри значения
Частая ошибка
Ошибка: всегда оборачивать все поля в кавычки без экранирования кавычек внутри.Правильно:
Локали: числа, даты, разделитель и предсказуемость
Что такое локаль в контексте CSV
Локаль (culture) влияет на то, как строкой представляются:1.5 или 1,5)02.03.2026 или 3/2/2026)В .NET это управляется CultureInfo.
Ссылка: CultureInfo Class
Почему это важно при экспорте
Если вы используетеToString() без указания культуры, результат зависит от машины, где запущено приложение.Пример проблемы:
en-US число станет 1234.56ru-RU он ожидает 1234,56В результате:
,)Практическая стратегия
Есть два распространённых подхода, и важно выбрать один.#### Подход для обмена между системами
,)CultureInfo.InvariantCulture для чисел и датСсылка: CultureInfo.InvariantCulture Property
#### Подход для людей и Excel в конкретной стране
; для ru-RU)Ограничение: такой CSV хуже подходит для межсистемного обмена, потому что он локалезависимый.
Кодировки: UTF-8, BOM и совместимость
Что такое кодировка
Кодировка определяет, как символы (например, кириллица) представлены в байтах файла. Ошибка кодировки выглядит как кракозябры.Рекомендуемый выбор
Для большинства современных сценариев:В .NET:
Encoding.UTF8Ссылка: Encoding.UTF8 Property
Excel и UTF-8
Исторически Excel на Windows нередко открывал CSV в локальной ANSI-кодировке и мог не распознать UTF-8 без специальных подсказок. В современных версиях ситуация лучше, но в реальных организациях всё ещё встречаются проблемы.Практические варианты повышения совместимости:
В .NET можно явно создать UTF-8 с BOM:
Ссылка: UTF8Encoding Class
Когда BOM может мешать
Некоторые системы (особенно самописные парсеры) не ожидают BOM в начале файла и воспринимают его как часть первого поля.Вывод:
Минимальные примеры для C# (как будет в следующих статьях)
Запись строк в файл с выбранной кодировкой
Ссылка: StreamWriter Class
Важная мысль перед реализацией
Чтобы CSV открывался стабильно, вам нужно явно зафиксировать три решения:И отдельно решить, как вы форматируете числа и даты:
InvariantCulture (предсказуемо для систем)Краткий чеклист перед экспортом CSV
,, ; или \t.".