CSV
CSV
CSV (Comma-Separated Values, «значения, разделённые запятыми») — это текстовый формат таблицы: каждая строка файла — одна строка таблицы, ячейки внутри строки разделены запятой (или другим символом). Самый старый и самый универсальный язык, на котором программы обмениваются табличными данными.
История
CSV — один из тех форматов, у которых нет ни «дня рождения», ни автора. Просто так сложилось.
- 1972 год — формат уже использовался в коммерческих программах IBM. Конкретно — в Fortran-программах для мейнфреймов IBM, где данные на перфокартах разделяли запятыми, чтобы программа могла прочесть значения подряд, не зная заранее ширины столбцов.
- Конец 1970-х — CSV закрепился в первых «настольных» базах данных и табличных процессорах: VisiCalc (1979), Lotus 1-2-3 (1983), позже dBase. Все они умели экспортировать и импортировать таблицы в виде «строки → переводы строк, ячейки → запятые». Это был самый дешёвый способ перенести данные из одной программы в другую.
- 1990-е — пришёл Microsoft Excel и сделал CSV де-факто стандартом офисного мира. Любая бухгалтерия, любой склад, любая CRM научилась «выгружать в CSV» и «загружать из CSV».
- 2005 год — наконец появился формальный стандарт: RFC 4180. Это документ Internet Engineering Task Force (IETF), который описывает «как правильно». До этого каждый писал CSV по-своему — и эти «диалекты» до сих пор живут в дикой природе.
- Сегодня — CSV остаётся самым популярным форматом обмена табличными данными. Когда вам говорят «выгрузите отчёт» — в 80% случаев имеют в виду именно CSV (или Excel, который читает CSV).
Никакой компании или фонда, который бы «владел» CSV, не существует. Формат полностью открытый, и любой инструмент в мире его понимает — хотя бы на базовом уровне.
Что это такое
Представь обычную таблицу в Excel: первая строка — заголовки столбцов, дальше идут строки с данными. CSV — это та же таблица, но записанная в виде обычного текстового файла, который можно открыть в Блокноте.
Минимальный пример:
name,age,city
Анна,32,Москва
Борис,45,Петербург
Виктор,28,Казань
Это таблица из трёх столбцов и трёх строк данных. Каждая строка файла соответствует одной строке таблицы. Запятая разделяет ячейки внутри строки. Перевод строки разделяет строки.
Главные принципы:
- Текстовый формат. Файл состоит из обычных символов — букв, цифр, знаков препинания. Никаких бинарных хитростей, никакой сжатой структуры. Открыл в любом редакторе — увидел содержимое.
- Плоская структура. Нет вложенности, нет деревьев, нет ссылок. Только строки и столбцы. То, что не помещается в эту матрицу, в CSV выразить нельзя.
- Без типов. В CSV нет понятия «это число, а это дата». Всё — текст. Получатель сам решает, как интерпретировать
42— как число или как строку из двух цифр. - Без схемы. Файл не описывает сам себя. Если первая строка не содержит заголовков — приходится догадываться, что означает каждый столбец.
CSV vs JSON. JSON хранит вложенные структуры (объекты внутри объектов, массивы внутри объектов), CSV — только плоскую таблицу. JSON помнит типы (число это число, строка это строка), CSV — нет. Зато CSV занимает меньше места и читается быстрее: в JSON каждое поле пишется со своим именем в каждой записи, в CSV имена столбцов записаны один раз сверху.
CSV vs Excel (.xlsx). Excel — это zip-архив с XML внутри, который хранит таблицу, формулы, форматирование, цвета ячеек, графики. CSV — голые значения без всякого оформления. Excel-файл всегда читается одинаково, CSV — зависит от того, чем открываешь.
Аналогии из жизни
Бухгалтерская книга-разлиновка. Большая разлинованная тетрадь, где каждая строчка — одна операция, каждая колонка — параметр (дата, сумма, контрагент). CSV — это та же тетрадь, только в цифровом виде. Аналогия точно ложится: тот же принцип «строки-колонки-без-оформления».
Где ломается: в бумажной книге можно написать примечание на полях, нарисовать стрелку, выделить цветом. В CSV — нельзя. Любая «нестрочная» информация исчезает при экспорте.
Список покупок на холодильнике. Каждая строчка — товар: «молоко 2 шт; хлеб 1 шт; яблоки 1 кг». Если ты везде ставишь точку с запятой, кто угодно может потом разобрать твой список и подсчитать общую массу — потому что разделитель один и тот же.
Где ломается: как только в названии товара появится точка с запятой («сок “Добрый” — 1 л; яблочный»), всё посыплется. Программа разобьёт это название на два «куска». Та же беда у CSV — если в самих данных встречается разделитель, нужны кавычки и экранирование.
Музыкальная партитура. Каждая строка — такт, каждая клеточка — нота. Любой музыкант в мире может прочесть твою партитуру, потому что нотная запись стандартизирована. CSV — такая же «партитура» для табличных данных: чем угодно её прочти, увидишь те же столбцы и строки.
Где ломается: партитура передаёт только высоту и длительность нот, но не передаёт интонацию или эмоции исполнителя. CSV тоже передаёт только сырые значения — без формул, без формата дат, без цветовой раскраски. То, что было в Excel красивым отчётом с диаграммами, после экспорта в CSV становится скучной матрицей чисел.
Как это работает
В простом случае CSV — это просто текстовый файл, где:
- строки разделены символом переноса (
\nили\r\n), - ячейки внутри строки разделены запятой (
,).
Но в реальной жизни почти всегда сложнее. Разберём по пунктам.
1. Разделитель. Каноническая запятая работает в англоязычном мире, где в числах используется точка как десятичный разделитель (3.14). В России и Европе в числах десятичный разделитель — запятая (3,14), и если такой числовой столбец сохранить как «значения через запятую», программа запутается. Поэтому в русских/европейских CSV разделителем часто становится точка с запятой (;), а в системах вроде Unix — табуляция (\t, такой формат называют TSV, Tab-Separated Values). Разделитель не записан в самом файле — получатель должен знать заранее, иначе угадывает.
2. Кавычки и экранирование. Что делать, если внутри ячейки есть сам разделитель — запятая, точка с запятой или перевод строки? Стандарт говорит: оборачивай такие ячейки в двойные кавычки.
id,name,note
1,"Иванов, А.","имя, отчество в одной ячейке"
2,"Петров","комментарий с
переводом строки"
А если внутри ячейки нужна сама двойная кавычка — её удваивают:
3,"фирма ""Восход""","коммент"
Это и есть «правила экранирования по RFC 4180». Многие парсеры (программы, которые читают CSV) умеют это, но многие — нет, и тогда возникают ошибки.
3. Заголовки. Первая строка по соглашению содержит названия столбцов. Соглашение — не обязаловка: некоторые CSV приходят без заголовков, и получатель должен знать порядок столбцов по документации. Это частый источник ошибок: добавили столбец в середину выгрузки — все скрипты на той стороне читают данные «не из той колонки» и тихо ломаются.
4. Кодировка. Самая большая боль. CSV — текст, а текст в файле кодируется в одной из кодировок: UTF-8 (современный стандарт), Windows-1251 (старый русский), CP1252 (старый английский). Если выгрузили в одной кодировке, а получатель прочёл в другой — на месте русских букв появятся «кракозябры»: Иванов вместо Иванов. Excel в Windows исторически открывает CSV в Windows-1251, и UTF-8 файлы там показываются неправильно — пока не сохранишь специально с пометкой «UTF-8 with BOM».
5. Парсинг. Программа, читающая CSV, делает примерно так (это и называется «парсер CSV»):
для каждой строки файла:
если ячейка начинается с кавычки:
читаем символы до закрывающей кавычки
(учитываем удвоенные кавычки внутри)
иначе:
читаем символы до следующего разделителя
добавляем ячейку в текущую строку
В нормальном языке программирования никто не пишет это руками — есть готовые библиотеки: csv в Python, xsv или csvkit в командной строке, read.csv в R, Papa Parse в JavaScript. Они умеют все варианты разделителей, кодировок и кавычек.
6. Чтение «потоком». Большое достоинство CSV — его можно читать построчно, не загружая весь файл в память. Файл на 10 ГБ читается строка за строкой, обрабатывается, и память расходуется только на одну строку за раз. С JSON или XML такое сделать гораздо сложнее — там структура цельная, без чёткого «конца записи». Это причина, почему аналитики любят CSV для больших выгрузок: 100 миллионов строк можно перемолоть простым скриптом.
Где встречается в обычной жизни
- Выгрузка из банка. Скачал «выписку по карте за месяц» — почти наверняка получил CSV или Excel-файл, который внутри сделан из CSV.
- Экспорт контактов из телефона. Google Contacts и iCloud дают возможность скачать всю записную книжку — это CSV с колонками «имя, телефон, email».
- Скачать историю заказов на маркетплейсе. Wildberries, Ozon, Amazon — кнопка «выгрузить таблицу» обычно даёт CSV.
- Импорт расписания в календарь. Многие университеты и кружки выкладывают расписание занятий CSV-файлом — потом импортируешь в Google Calendar.
- Открыл «выгрузка_отчёт.xlsx», увидел кракозябры. Это CSV в кодировке Windows-1251, который Excel пытается прочитать как UTF-8. Самое частое столкновение обывателя с CSV-проблемами.
Где встречается в IT и бизнесе
- Экспорт-импорт между CRM, ERP и аналитикой. «Выгрузил клиентов из Bitrix24, импортировал в amoCRM» — посредником почти всегда CSV. Самый дешёвый способ перенести данные между двумя несвязанными системами.
- Заливка пакетов данных в внешние сервисы. Загрузка тысяч строк в Яндекс.Метрику, Google Ads, Mailchimp — почти всегда CSV. Системы рекламы и рассылок ожидают именно его.
- Дата-инженерия и аналитика. Файлы CSV — основной «промежуточный формат» между ETL-этапами: выгрузил из источника → сложил в CSV → почистил → загрузил в хранилище. Современные форматы (Parquet, Avro) эффективнее, но CSV всё ещё стартовая точка.
- Логи и события. Многие системы пишут события в CSV (одна строка — одно событие). Удобно потом грузить в Excel, в pandas, в любую аналитику.
- Конфигурации и справочники. Список регионов, валют, продуктов, статусов заказов — часто хранят в CSV, чтобы менеджер мог поправить в Excel и не звать программиста.
Кто пользуется
CSV пользуются буквально все, кто работает с данными — назвать конкретные компании невозможно, проще назвать тех, кто не пользуется (никто).
Более интересные цифры:
- Excel (Microsoft 365) — около 1,1 млрд пользователей в мире (оценка Microsoft, 2024). Из них значимая часть регулярно импортирует и экспортирует CSV.
- Google Sheets — ещё ~900 млн активных пользователей Google Workspace. Тоже массово работают с CSV-импортом.
- GitHub в 2023 году отчитывался, что CSV-файлы — один из 20 самых распространённых типов файлов в публичных репозиториях.
- В реальных банковских и государственных интеграциях большая часть «выгрузок отчётности» в России (бухгалтерия, налоги, статистика) — CSV или его близкий родственник (XML, реже Excel).
Если коротко: каждый, кто хоть раз нажимал «Сохранить как» в Excel и видел опцию «CSV (разделители — запятые)», уже знаком с этим форматом.
Альтернативы и конкуренты
JSON. Плюсы: вложенные структуры, типы данных, понятен веб-разработчикам, де-факто стандарт API. Минусы: больше места, медленнее парсится для больших таблиц, нет потокового чтения «из коробки».
XML. Плюсы: жёсткая схема (XSD), валидация, поддержка пространств имён, отлично для документов с разметкой. Минусы: громоздкий (на каждое поле — открывающий и закрывающий тег), медленнее, для табличных данных избыточен.
Excel (.xlsx). Плюсы: сохраняет форматирование, формулы, графики, листы; знаком любому офисному сотруднику. Минусы: бинарный (точнее, zip+XML), нельзя редактировать в обычном текстовом редакторе, сложнее парсить программно, привязан к Microsoft (хотя есть открытые библиотеки).
Parquet. Плюсы: колоночное хранение, отличное сжатие, в 10–100 раз быстрее CSV для аналитики, типизированные данные. Минусы: бинарный, нельзя открыть в Блокноте, нужен специальный инструмент для просмотра. Используется в дата-инженерии (Spark, Hadoop, современные хранилища данных).
TSV (Tab-Separated Values). Плюсы: тот же CSV, но разделитель — табуляция; почти нет проблем с экранированием (в данных табуляция встречается редко). Минусы: невидимый разделитель (визуально не отличишь от пробелов), Excel не всегда открывает корректно.
Когда НЕ стоит использовать
- Когда данные имеют вложенную структуру. Если у клиента может быть несколько адресов, телефонов, заказов — в CSV это превратится либо в дубли строк, либо в «полтора колонки с непонятным содержимым». Лучше JSON или нормальная база.
- Когда нужна точная типизация. В CSV
01.05.2026— это строка. Получатель может прочесть это как дату 1 мая, как 5 января, как просто текст — никто не гарантирует. Для критичных систем (платежи, бухгалтерия) лучше форматы с явной схемой: JSON Schema, Avro, Parquet. - Когда речь о терабайтах данных и нужна быстрая аналитика. CSV строчный и нетипизированный — для big data его сменяют колоночные форматы вроде Parquet и ORC. Они занимают в 5–20 раз меньше места и в десятки раз быстрее читаются для аналитических запросов.
Связанные понятия
- TSV (Tab-Separated Values) — то же самое, но разделитель — табуляция вместо запятой.
- RFC 4180 — формальная спецификация CSV, опубликована IETF в 2005 году.
- Parquet — колоночный бинарный формат, эволюция CSV для больших данных.
- UTF-8 — самая распространённая кодировка текста; рекомендуется по умолчанию для CSV.
- BOM (Byte Order Mark) — служебные байты в начале файла, которые помогают Excel распознать UTF-8.
- Парсер (parser) — программа, которая читает текстовый формат и превращает его в структуру в памяти.
Литература и источники
- RFC 4180 «Common Format and MIME Type for Comma-Separated Values (CSV) Files» (Y. Shafranovich, 2005) — официальная спецификация. Искать:
RFC 4180на сайте IETF. - Wikipedia «Comma-separated values» (ru/en) — отличный обзор истории и диалектов формата. URL: https://en.wikipedia.org/wiki/Comma-separated_values
- Python docs
csvmodule — основной инструмент работы с CSV в Python, с примерами и описанием диалектов. URL: https://docs.python.org/3/library/csv.html - Wes McKinney «Python for Data Analysis» (3-е издание, 2022, en) — главы про чтение/запись CSV в pandas. Стандарт для аналитиков и дата-инженеров.
- csvkit — набор утилит командной строки для работы с CSV (поиск, статистика, конвертация). URL: https://csvkit.readthedocs.io/
- Статья «Falsehoods Programmers Believe About CSVs» (искать по этому запросу в Google) — список типичных заблуждений и боли при работе с CSV.
Где встретилось у меня
Вчера готовил пакет номеров для контактного центра: семь групп застройщиков, 146 строк. Это была CSV-таблица «номер → застройщик». Внутри обработки скрипт находил дубли (один номер у двух застройщиков сразу), удалял их по правилу, пропускал через фильтр чёрного списка, формировал превью и отправлял по группам в КЦ. Каждый шаг конвейера читал и переписывал CSV — это самый удобный формат, когда нужно передать таблицу из одного шага в другой и при необходимости открыть глазами в Numbers, чтобы проверить, что данные не поехали.
Краткое резюме
- CSV — текстовый формат таблицы: строки файла = строки таблицы, ячейки разделены запятой (или другим знаком).
- Это самый универсальный язык обмена табличными данными — его понимают абсолютно все программы, от Excel до самописных скриптов.
- Главные грабли: разделители (запятая vs точка с запятой), кодировки (UTF-8 vs Windows-1251), экранирование внутри ячеек.
- Используй CSV, когда данные плоские и важна совместимость; избегай, когда нужна вложенность, типы или аналитика на сотнях миллионов строк.
- Если открыл выгрузку и видишь «кракозябры» — это почти всегда несовпадение кодировок, а не «испорченный файл».