CSV (Comma-Separated Values) — это минималистичный текстовый формат, созданный для хранения и передачи табличных данных между разными системами. Каждая строка в таком файле представляет собой отдельную запись, а значения внутри неё разделяются символами — чаще запятой, но нередко и точкой с запятой, табуляцией или другим разделителем. Этот формат не нуждается в сложной структуре: данные можно прочитать в обычном текстовом редакторе, а программы — импортировать их без дополнительных настроек.
CSV применяют, когда нужно быстро и без потерь обменяться таблицей между системами. Например, экспортировать отчёт из бухгалтерии в Excel, перенести список клиентов из CRM в Google Sheets или выгрузить данные из базы в аналитическую платформу. Формат универсален: он не зависит от программного окружения и поддерживается практически везде, где можно открыть текстовый файл.
История CSV восходит к первым электронным таблицам и базам данных конца 1970-х. Тогда, на фоне несовместимости программ, формат стал простейшим способом обмена структурированными данными. За десятилетия он не утратил актуальности: несмотря на появление JSON, XML и XLSX, CSV остаётся рабочим стандартом для переноса таблиц — лёгким, прозрачным и свободным от привязки к конкретным системам.
Спецификация и стандарты
Хотя CSV считается простым форматом, у него есть формальное описание — RFC 4180, опубликованное в 2005 году. Этот документ не делает формат жёстко стандартизированным, но описывает основные принципы, которые помогают программам корректно обмениваться данными.
RFC 4180: ключевые положения
- Каждая строка файла — отдельная запись (обычно соответствует строке таблицы).
- Поля внутри строки разделяются запятой, однако допускается использование других символов, например точки с запятой или табуляции.
- Текстовые значения можно заключать в кавычки "...", особенно если внутри встречаются запятые, кавычки или переводы строк.
- Кавычки внутри значения должны дублироваться: "Company ""ABC"" Ltd".
- Перенос строк — CRLF (Windows) или LF (Unix), в зависимости от системы.
Когда стандарт обязателен, а когда есть допущения
RFC 4180 носит рекомендательный характер. Программы и сервисы могут использовать собственные разделители, кодировки или способы экранирования. Например, Excel в русской локализации применяет точку с запятой вместо запятой, чтобы избежать конфликта с десятичным разделителем.
Несовместимости и расхождения
Именно из-за отсутствия строгого единого стандарта CSV-файлы могут вести себя по-разному:
- различаются разделители (;, ,, \t);
- встречаются разные кодировки (UTF-8, Windows-1251);
- некоторые программы добавляют лишние кавычки или пропускают их вовсе.
Эти мелкие отличия нередко вызывают ошибки при импорте или экспорте данных, особенно между системами, созданными в разных странах или на разных языках. Поэтому перед использованием CSV важно проверять настройки разделителя и кодировку.
Синтаксис CSV: базовые правила
Формат CSV выглядит просто, но имеет ряд правил, которые обеспечивают корректное чтение и запись данных. Нарушение этих правил может привести к смещению столбцов, потере информации или ошибкам импорта.
Строки и поля, разделители
Каждая строка файла соответствует одной записи таблицы. Поля внутри строки разделяются запятой, но в зависимости от локализации или программы могут использоваться и другие символы — точка с запятой, табуляция или вертикальная черта. Пример:
Кавычки и экранирование
Если значение содержит запятую, кавычку или перенос строки, его заключают в двойные кавычки:
Кавычки внутри значения удваиваются, чтобы программа не восприняла их как границы поля:
Обработка разделителя внутри поля
Разделитель, заключённый в кавычки, не считается границей поля. Это позволяет хранить значения, где запятая является частью текста.
Пустые поля
Если значение отсутствует, поле оставляют пустым между разделителями:
В первом случае пустое поле в конце строки, во втором — в середине.
Перенос строки внутри полей
Если в тексте встречается разрыв строки, он сохраняется, если значение заключено в кавычки:
Варианты конца строки
CSV поддерживает разные обозначения конца строки:
-
CR (\r) — используется в старых системах macOS;
-
LF (\n) — стандарт для Unix и Linux;
-
CRLF (\r\n) — используется в Windows.
Ограничения
Все строки в файле должны содержать одинаковое количество полей. Если где-то их больше или меньше, программа при импорте может «сдвинуть» столбцы и нарушить структуру таблицы.
Кодировки и символы
Работа с CSV-файлами напрямую зависит от выбранной кодировки — способа, которым символы представляются в виде байтов. Если кодировка не совпадает между программами, текст может отображаться с ошибками: вместо букв появятся «кракозябры» или вопросительные знаки.
Unicode, UTF-8, UTF-16, ANSI и другие
Наиболее распространённая кодировка для CSV сегодня — UTF-8, поскольку она поддерживает все языки и символы. Встречаются также UTF-16 (в Windows) и ANSI (старая система, зависящая от локали).
-
UTF-8 — универсальная кодировка, совместима с большинством систем и редакторов.
-
UTF-16 — часто используется в Microsoft Excel, но может вызывать несовместимость при открытии файла в других программах.
-
ANSI — ограничена национальными наборами символов (например, Windows-1251 для кириллицы).
При работе с файлами из разных систем важно уточнять, в какой кодировке они сохранены, и при необходимости перекодировать их в UTF-8.
BOM (Byte Order Mark)
Некоторые CSV-файлы, особенно созданные в Excel, содержат в начале невидимый символ BOM — Byte Order Mark. Он помогает программам определить, что файл записан в формате UTF-8 или UTF-16. Однако не все приложения обрабатывают BOM корректно. Например, при чтении файла в Python или других языках программирования BOM может восприниматься как часть первого поля.
Национальные и специальные символы
CSV часто используется для хранения текстов на разных языках, поэтому важно, чтобы кодировка поддерживала национальные алфавиты — кириллицу, диакритические знаки, иероглифы. Кроме того, в таблицах нередко встречаются специальные символы вроде кавычек, запятых, знаков «;» или «|» — их нужно правильно экранировать с помощью кавычек, чтобы избежать ошибок при импорте.
Проблемы и решения
-
Проблема: при открытии файла в Excel вместо кириллицы отображаются вопросительные знаки.
Решение: сохранить файл в UTF-8 без BOM или выбрать нужную кодировку при открытии.
-
Проблема: в первой ячейке появляется странный символ «ï» или «?» — это следствие некорректного чтения BOM.
Решение: удалить BOM вручную или открыть файл с указанием параметра encoding='utf-8-sig'.
Соблюдение единого стандарта кодировки (обычно UTF-8 без BOM) помогает избежать большинства проблем при работе с CSV-файлами на разных платформах.
Работа с CSV в языках и инструментах
CSV-файлы поддерживаются практически во всех языках программирования и офисных приложениях. Это делает формат универсальным для интеграций, анализа данных и автоматизации процессов.
Python
В Python работа с CSV возможна двумя основными способами:
Модуль csv — стандартная библиотека, позволяющая построчно читать и записывать данные:
*Pandas — библиотека для анализа данных, которая автоматически определяет разделители и кодировки:
Java
Для Java существует несколько популярных библиотек:
-
OpenCSV — простой инструмент для чтения и записи CSV-файлов:
-
Apache Commons CSV — более гибкая библиотека, поддерживающая разные кодировки и форматирование.
C# / .NET
В экосистеме .NET CSV можно обработать с помощью TextFieldParser из Microsoft.VisualBasic.FileIO или библиотек вроде CsvHelper:
JavaScript / Node.js
На стороне браузера CSV можно читать через FileReader, а в Node.js — использовать библиотеки csv-parser или Papaparse:
Excel, LibreOffice, Google Sheets
Офисные программы автоматически открывают CSV-файлы и позволяют выбирать разделитель и кодировку. Excel нередко добавляет BOM и точку с запятой вместо запятой в русской локали, поэтому при экспорте в другие системы стоит проверять настройки. Google Sheets корректно обрабатывает UTF-8 и умеет экспортировать данные обратно в CSV.
SQL и СУБД
CSV часто используется для импорта и экспорта данных между базами.
В PostgreSQL — аналогичная команда:
Формат удобен тем, что его можно легко преобразовать в таблицу без дополнительных инструментов и сложных зависимостей.
Обработка больших CSV / масштабируемость
Потоковая (ленивая) обработка
Крупные CSV удобнее читать потоково: данные поступают построчно, без загрузки всего файла в память. В Python это csv.reader по открытому файловому объекту; в Node.js — стримы; в Java — BufferedReader или итераторы библиотек (OpenCSV, Commons CSV). Такой подход стабилен на файлах десятков гигабайт и позволяет сразу обрабатывать/писать результат.
Чтение по частям (чанки)
Когда нужна табличная обработка, используют пакетную загрузку фиксированными порциями. В Pandas — read_csv(..., chunksize=100_000), в PostgreSQL — COPY в промежуточную таблицу по частям, в Spark/Dask — распределённые партиции. Чанки дают контроль над памятью и позволяют распараллеливать этапы (очистка, агрегации, запись).
Ограничения памяти
Ключевые риски — попытка «распухнуть» датафрейм в RAM, дублирование структур, дорогое приведение типов. Практики: жёстко задавать типы столбцов при чтении, отключать авто-инференс, преобразовывать строки в категориальные, использовать генераторы/итераторы, временные файлы и поэтапную агрегацию (map → reduce).
Компрессия, архивирование, разделение на части
Сжатие уменьшает I/O и место на диске: gzip/bzip2/zstd читаются потоково большинством инструментов (Pandas compression='gzip', zstd; zcat | …). Для параллельной загрузки лучше хранить набором файлов (sharding: data_0001.csv.gz, data_0002.csv.gz) или партициями по дате/ключу. При экспорте фиксируйте одинаковую схему столбцов и одинаковый разделитель/кодировку во всех частях — это упростит последующую сборку и импорт.
Ошибки, исключения и безопасность
Работа с CSV кажется простой, но даже в таком формате часто возникают ошибки, особенно при импорте и интеграции данных из разных систем.
Неправильное количество полей
Если строки содержат разное число столбцов, программа может «сдвинуть» данные — значения окажутся не в тех колонках. Причина чаще всего в лишних разделителях или пропущенных кавычках. Проверять равномерность структуры стоит перед импортом с помощью валидации или предварительного просмотра.
Непарные кавычки
Классическая ошибка — когда поле открывается кавычкой, но не закрывается. В результате оставшаяся часть файла может восприниматься как одно длинное поле. Исправляется построчной проверкой или использованием специализированных парсеров, которые умеют восстанавливать структуру.
CSV-инъекции
Опасная, но часто игнорируемая уязвимость. Если CSV открывается в Excel или Google Sheets, строка, начинающаяся с =, +, - или @, может интерпретироваться как формула. Это даёт злоумышленнику возможность внедрить вредоносные выражения вроде =HYPERLINK("http://phishing-site.com").
Чтобы избежать таких атак, все значения, начинающиеся с этих символов, следует экранировать или преобразовывать в текст — например, добавлять апостроф перед ними.
Неподходящие разделители
Использование запятой, точки с запятой или табуляции без согласования может привести к ошибкам при открытии файла в другой программе. Важно заранее определить символ-разделитель и явно указать его при экспорте и импорте.
Ошибки кодировок
Самая частая причина искажённых символов. Разные системы используют разные кодировки — UTF-8, UTF-16, Windows-1251. При несовпадении отображаются «кракозябры». Оптимальный способ — всегда сохранять файлы в UTF-8 без BOM и при открытии явно указывать кодировку.
Сравнение CSV с альтернативами
Формат CSV прост и универсален, но у него есть конкуренты, лучше подходящие для определённых задач.
JSON
JSON хранит данные в виде пар «ключ–значение» и поддерживает вложенные структуры. Он удобен для передачи сложных объектов между веб-сервисами и приложениями. Однако для табличных данных JSON менее компактен и требует больше ресурсов при чтении.
XML
XML использует теги и иерархическую структуру, что делает его гибким, но громоздким. Он подходит для систем, где важна валидация схемы и строгое описание данных. CSV выигрывает у XML в простоте и размере файлов.
Parquet, Avro, Feather
Эти форматы применяются в аналитике и обработке больших данных. Они поддерживают сжатие, типизацию и эффективное чтение по столбцам. Parquet и Avro используют в Apache Spark, Hadoop, Snowflake. Однако для простого обмена таблицами они избыточны — CSV остаётся удобнее и понятнее.
Библиотеки, утилиты и инструменты
CLI-утилиты.
- csvkit — набор инструментов для анализа CSV в терминале: фильтрация, сортировка, конвертация.
- csvtool, mlr (Miller) — лёгкие утилиты для построчной обработки больших файлов.
Графические редакторы.
-
Modern CSV, CSVed, **Ron’s Editor **— позволяют редактировать таблицы без потери форматирования.
- Веб-варианты — ExtendsClass, CSV Viewer Online, где можно открыть и править файл прямо в браузере.
Конверторы и онлайн-сервисы.
- Онлайн-инструменты для преобразования CSV в JSON, XML, Excel и обратно.
- Утилиты Python (pandas.to_csv(), read_csv()) и Node.js (csvtojson) выполняют конвертацию программно.
Рекомендации и лучшие практики
- Использовать единообразный разделитель (; или ,) и согласовать его с системой-получателем.
- Всегда явно указывать кодировку UTF-8 без BOM.
- Экранировать кавычки и специальные символы внутри текстовых полей.
- Добавлять строку заголовков с понятными именами столбцов.
- Перед импортом выполнять валидацию: проверять количество полей, кодировку и наличие непарных кавычек.
Заключение
CSV остаётся самым доступным и гибким способом обмена табличными данными. Он не требует специализированных библиотек, читается в любом редакторе и легко интегрируется с системами.
Однако у формата есть ограничения: отсутствие типизации, риск ошибок при кодировках и низкая надёжность при работе с большими объёмами данных.
Современные тенденции показывают, что CSV постепенно уступает место более структурированным форматам вроде Parquet и Avro, но сохраняет свою актуальность как лёгкий и понятный инструмент для быстрой передачи информации между приложениями.
<!DOCTYPE html>
<html class="h-100" data-bs-theme="light" data-mantine-color-scheme="light" lang="ru" prefix="og: https://ogp.me/ns#">
<head>
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<meta content="IE=Edge" http-equiv="X-UA-Compatible">
<link crossorigin="true" href="https://cdn.hexlet.io" rel="preconnect">
<link href="https://mc.yandex.ru" rel="preconnect">
<meta content="aa2vrdtq64dub8knuf83lwywit311w" name="facebook-domain-verification">
<link href="/favicon.ico" rel="icon" sizes="any">
<link href="/favicon.svg" rel="icon" type="image/svg+xml">
<link href="/apple-touch-icon.png" rel="apple-touch-icon">
<link href="/manifest.webmanifest" rel="manifest">
<script>
//<![CDATA[
window.gon={};gon.ym_counter="25559621";gon.is_bot=true;gon.applications={};gon.current_user={"id":null,"last_viewed_notification_id":null,"email":null,"state":null,"first_name":"","last_name":"","created_at":"2026-02-26 22:27:15 UTC","current_program":null,"current_team":null,"full_name":"","guest":true,"can_use_paid_features":false,"is_hexlet_employee":false,"sanitized_phone_number":"","can_subscribe":true,"can_renew_education":false};gon.token="LxSrD0r64XHB57BQhh78fnZUDPCGsgLBuDyoDla8CbPAxWA4uIRMEXeklMiKEQwJtl0hWo6F_GMF3DJaBLvu3Q";gon.locale="ru";gon.language="ru";gon.theme="light";gon.rails_env="production";gon.mobile=false;gon.google={"analytics_key":"UA-1360700-51","optimize_key":"GTM-5QDVFPF"};gon.captcha={"google_v3_site_key":"6LenGbgZAAAAAM7HbrDbn5JlizCSzPcS767c9vaY","yandex_site_key":"ysc1_Vyob5ZPPUdPBsu0ykt8bVFdzsfpoVjQChLGl2b4g19647a89","verification_failed":null};gon.social_signin=false;gon.typoreporter_google_form_id="1FAIpQLSeibfGq-KvWQ2Fyru-zkFFRVTLBuzXAHAoEyN1p49FtDmNoNA";
//]]>
</script>
<meta charset="utf-8">
<title>CSV — что это? Спецификация и стандарты, синтаксис, кодировки и символы, ошибки и рекомендации по работе с CSV</title>
<meta name="description" content="1 ответ на вопрос, что такое CSV простыми словами? Глоссарий Хекслета.">
<link rel="canonical" href="https://ru.hexlet.io/qna/glossary/questions/chto-takoe-csv">
<meta property="og:description" content="1 ответ
на вопрос, что такое CSV простыми словами? Глоссарий Хекслета.">
<meta property="og:title" content="CSV — что это? Спецификация и стандарты, синтаксис, кодировки и символы, ошибки и рекомендации по работе с CSV">
<meta property="og:url" content="https://ru.hexlet.io/qna/glossary/questions/chto-takoe-csv">
<meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="L5oXMYinOJR6_UKREjT_H8dggzmjGi3tmrKzTI4M4rPAS9wGetmV9My-ZgkeOw9oB2muk6st008nUikY3AsF3Q" />
<script src="/vite/assets/inertia-DfXos102.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/preload-helper-BJ4cLWpC.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/init-BrRXra1y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ahoy-DrlRQ-1D.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/analytics-cb8xch9l.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ErrorFallbackBlock-naDSYSy9.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Surface-DL2bpZA-.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/gon-D3e4yh1x.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/mantine-CGMYrt2Y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/utils-DRqSHbQE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/extends-C-EagtpE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/inheritsLoose-BBd-DCVI.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/objectWithoutPropertiesLoose-DRHXDhjp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/index.esm-DAqKOkZ0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Button-CGPUux8l.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/CloseButton-D1euiPao.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Group-BX48WcuU.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Loader-BQEY8g6v.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Modal-Cy3HByv7.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/OptionalPortal-1Hza5P2w.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Stack-CtjJzfw4.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Textarea-Ck64llAy.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Box-B5-OOzBf.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/DirectionProvider-Dc9zdUke.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/events-DJQOhap0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-reduced-motion-D2owz4wa.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-disclosure-zKtK5W1r.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-hotkeys-Cnc_Rwkb.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/random-id-DOQyszCZ.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/notifications.store-C-3AFSMn.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/exports-C_MrNx_T.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/axios-BEvgo0ym.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dayjs.min-BkKovM-s.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/i18next-BlSq9s7B.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/client-U9M77rxp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-dom-DaLxUz_h.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useTranslation-Bx1Cdrkz.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/compiler-runtime-6XxiPFnt.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/jsx-runtime-CwjcCKJi.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-CkL4ZRHB.js" as="script" crossorigin="anonymous">
<link rel="stylesheet" href="/vite/assets/application-BqhCP46M.js" />
<script src="/vite/assets/application-Df9RExpe.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/autocomplete-VMNbxKGl.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/createPopper-C3aM9r1M.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/js.cookie-D1-O8zkX.js" as="script" crossorigin="anonymous"><link rel="stylesheet" href="/vite/assets/application-C8HjmMaq.css" media="screen" />
<script>
window.ym = function(){(ym.a=ym.a||[]).push(arguments)};
window.addEventListener('load', function() {
setTimeout(function() {
ym.l = 1*new Date();
ym(window.gon.ym_counter, "init", {
clickmap: true,
trackLinks: true,
accurateTrackBounce: true,
webvisor: true
});
// Загружаем скрипт
var k = document.createElement('script');
k.async = 1;
k.src = 'https://mc.yandex.ru/metrika/tag.js';
document.head.appendChild(k);
ym(window.gon.ym_counter, 'getClientID', function(clientID) {
window.ymClientId = clientID;
});
}, 1500);
});
</script>
<!-- Google Tag Manager - deferred -->
<script>
// dataLayer stub сразу — пуши работают до загрузки скрипта
window.dataLayer = window.dataLayer || [];
// Сам скрипт — отложенно после load
window.addEventListener('load', function() {
setTimeout(function() {
dataLayer.push({'gtm.start': new Date().getTime(), event: 'gtm.js'});
var j = document.createElement('script');
j.async = true;
j.src = 'https://www.googletagmanager.com/gtm.js?id=GTM-WK88TH';
document.head.appendChild(j);
}, 1500);
});
</script>
<!-- End Google Tag Manager -->
</head>
<body>
<noscript>
<div>
<img alt="" src="https://mc.yandex.ru/watch/25559621" style="position:absolute; left:-9999px;">
</div>
</noscript>
<header class="sticky-top bg-body">
<nav class="navbar navbar-expand-lg">
<div class="container-xxl">
<a class="navbar-brand" href="/"><img alt="Логотип Хекслета" height="24" src="https://ru.hexlet.io/vite/assets/logo_ru_light-BpiEA1LT.svg" width="96">
</a><button aria-controls="collapsable" aria-expanded="false" aria-label="Меню" class="navbar-toggler border-0 mb-0 mt-1" data-bs-target="#collapsable" data-bs-toggle="collapse">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="collapsable">
<ul class="navbar-nav mb-lg-0 mt-lg-1">
<li class="nav-item dropdown">
<button aria-haspopup class="btn nav-link" data-bs-toggle="dropdown" type="button">
Все курсы
<span class="bi bi-chevron-down align-middle ms-1"></span>
</button>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item d-flex py-2" href="/courses"><div class="fw-bold me-auto">Все что есть</div>
<div class="text-muted">117</div>
</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li class="dropdown-item">
<b>Популярные категории</b>
</li>
<li>
<a class="dropdown-item py-2" href="/courses_devops">Курсы по DevOps
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_data_analytics">Курсы по аналитике данных
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_programming">Курсы по программированию
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_testing">Курсы по тестированию
</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li class="dropdown-item">
<b>Популярные курсы</b>
</li>
<li>
<a class="dropdown-item py-2" href="/programs/devops-engineer-from-scratch">DevOps-инженер с нуля
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/go">Go-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/java">Java-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/python">Python-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/qa-auto-engineer-java">Автоматизатор тестирования на Java
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/data-analytics">Аналитик данных
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/frontend">Фронтенд-разработчик
</a></li>
</ul>
</li>
<li class="nav-item dropdown">
<button aria-haspopup class="btn nav-link" data-bs-toggle="dropdown" type="button">
О Хекслете
<span class="bi bi-chevron-down align-middle"></span>
</button>
<ul class="dropdown-menu bg-body">
<li>
<a class="dropdown-item py-2" href="/pages/about">О нас
</a></li>
<li>
<a class="dropdown-item py-2" href="/blog">Блог
</a></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/hse-research" role="button">Результаты (Исследование)
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://career.hexlet.io" role="button">Хекслет Карьера
</span></li>
<li>
<a class="dropdown-item py-2" href="/testimonials">Отзывы студентов
</a></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://t.me/hexlet_help_bot" role="button">Поддержка (В ТГ)
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/referal-program/?promo_creative=priglasite-druzei&promo_name=referal-program&promo_position=promo_position&promo_start=010724&promo_type=link" role="button">Реферальная программа
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/certificate" role="button">Подарочные сертификаты
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://hh.ru/employer/4307094" role="button">Вакансии
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://b2b.hexlet.io" data-target="_blank" role="button">Компаниям
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://hexly.ru/" data-target="_blank" role="button">Колледж
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://hexlyschool.ru/" data-target="_blank" role="button">Частная школа
</span></li>
</ul>
</li>
<li><a class="nav-link" href="/subscription/new">Подписка</a></li>
</ul>
<ul class="navbar-nav flex-lg-row align-items-lg-center gap-2 ms-auto">
<li>
<a class="nav-link" aria-label="Переключить тему" href="/theme/switch?new_theme=dark"><span aria-hidden="true" class="bi bi-moon"></span>
</a></li>
<li>
<span data-target="_self" class="nav-link external-link" data-href="/u/new" role="button"><span>Регистрация</span>
</span></li>
<li>
<span data-target="_self" class="nav-link external-link" data-href="https://ru.hexlet.io/session/new" role="button"><span>Вход</span>
</span></li>
</ul>
</div>
</div>
</nav>
</header>
<div class="x-container-xxxl">
</div>
<main class="mb-6 min-vh-100 h-100">
<div id="app" data-page="{"component":"web/qna/questions/show","props":{"errors":{},"locale":"ru","language":"ru","httpsHost":"https://ru.hexlet.io","host":"ru.hexlet.io","colorScheme":"light","auth":{"user":{"id":null,"last_viewed_notification_id":null,"email":null,"state":null,"first_name":"","last_name":"","created_at":"2026-02-26T22:27:15.374Z","current_program":null,"current_team":null,"full_name":"","guest":true,"can_use_paid_features":false,"is_hexlet_employee":false,"sanitized_phone_number":"","can_subscribe":true,"can_renew_education":false}},"cloudflareTurnstileSiteKey":"0x4AAAAAAA15KmeFXzd2H0Xo","vkIdClientId":"51586979","yandexIdClientId":"88d071f1d3384eb4bd1deb37910235c7","formAuthToken":"53V2rlmzXNfHtE7qgs87uS3_lJzntmQ4op195doKDGgIpL2Zq83xt3H3anKOwMvO7fa5Nu-BmpoffeexiA3rBg","category":{"id":15,"title":"Глоссарий","slug":"glossary","questions_count":382,"locale":"ru"},"mainStackCategory":null,"answerDto":{"id":null,"body":"","meta":{"model":"question_answer","relations":{}}},"question":{"creator":{"id":104929,"email":"feycot@gmail.com","first_name":"Nikolai","last_name":"Gagarinov","telegram":"","full_name":"Nikolai Gagarinov","removed":false},"category":{"id":15,"title":"Глоссарий","slug":"glossary","questions_count":382,"locale":"ru"},"tags":[],"id":6113,"answers_count":1,"slug":"chto-takoe-csv","state":"published","title":"CSV","created_at":"2025-11-18T12:18:19.575Z","details":null,"best_answer_id":5152,"related_stacks_count":0},"answers":[{"user":{"id":104929,"email":"feycot@gmail.com","first_name":"Nikolai","last_name":"Gagarinov","telegram":"","full_name":"Nikolai Gagarinov","removed":false},"question":{"creator":{"id":104929,"email":"feycot@gmail.com","first_name":"Nikolai","last_name":"Gagarinov","telegram":"","full_name":"Nikolai Gagarinov","removed":false},"category":{"id":15,"title":"Глоссарий","slug":"glossary","questions_count":382,"locale":"ru"},"tags":[],"id":6113,"answers_count":1,"slug":"chto-takoe-csv","state":"published","title":"CSV","created_at":"2025-11-18T12:18:19.575Z","details":null,"best_answer_id":5152,"related_stacks_count":0},"id":5152,"state":"active","body":"\nCSV (Comma-Separated Values) — это минималистичный текстовый формат, созданный для хранения и передачи табличных данных между разными системами. Каждая строка в таком файле представляет собой отдельную запись, а значения внутри неё разделяются символами — чаще запятой, но нередко и точкой с запятой, табуляцией или другим разделителем. Этот формат не нуждается в сложной структуре: данные можно прочитать в обычном текстовом редакторе, а программы — импортировать их без дополнительных настроек.\n\n\n\nCSV применяют, когда нужно быстро и без потерь обменяться таблицей между системами. Например, экспортировать отчёт из бухгалтерии в Excel, перенести список клиентов из CRM в Google Sheets или выгрузить данные из базы в аналитическую платформу. Формат универсален: он не зависит от программного окружения и поддерживается практически везде, где можно открыть текстовый файл.\n\nИстория CSV восходит к первым электронным таблицам и базам данных конца 1970-х. Тогда, на фоне несовместимости программ, формат стал простейшим способом обмена структурированными данными. За десятилетия он не утратил актуальности: несмотря на появление JSON, XML и XLSX, CSV остаётся рабочим стандартом для переноса таблиц — лёгким, прозрачным и свободным от привязки к конкретным системам.\n\n## Спецификация и стандарты\n\nХотя CSV считается простым форматом, у него есть формальное описание — **RFC 4180**, опубликованное в 2005 году. Этот документ не делает формат жёстко стандартизированным, но описывает основные принципы, которые помогают программам корректно обмениваться данными.\n\n### RFC 4180: ключевые положения\n\n* Каждая строка файла — отдельная запись (обычно соответствует строке таблицы).\n* Поля внутри строки разделяются запятой, однако допускается использование других символов, например точки с запятой или табуляции.\n* Текстовые значения можно заключать в кавычки \"...\", особенно если внутри встречаются запятые, кавычки или переводы строк.\n* Кавычки внутри значения должны дублироваться: `\"Company \"\"ABC\"\" Ltd\"`.\n* Перенос строк — `CRLF` (Windows) или `LF` (Unix), в зависимости от системы.\n\n### Когда стандарт обязателен, а когда есть допущения\n\nRFC 4180 носит рекомендательный характер. Программы и сервисы могут использовать собственные разделители, кодировки или способы экранирования. Например, Excel в русской локализации применяет точку с запятой вместо запятой, чтобы избежать конфликта с десятичным разделителем.\n\n### Несовместимости и расхождения\n\nИменно из-за отсутствия строгого единого стандарта CSV-файлы могут вести себя по-разному:\n\n* различаются разделители (`;`, `,`, `\\t`);\n* встречаются разные кодировки (UTF-8, Windows-1251);\n* некоторые программы добавляют лишние кавычки или пропускают их вовсе.\n\nЭти мелкие отличия нередко вызывают ошибки при импорте или экспорте данных, особенно между системами, созданными в разных странах или на разных языках. Поэтому перед использованием CSV важно проверять настройки разделителя и кодировку.\n\n## Синтаксис CSV: базовые правила\n\nФормат CSV выглядит просто, но имеет ряд правил, которые обеспечивают корректное чтение и запись данных. Нарушение этих правил может привести к смещению столбцов, потере информации или ошибкам импорта.\n\n### Строки и поля, разделители\n\nКаждая строка файла соответствует одной записи таблицы. Поля внутри строки разделяются запятой, но в зависимости от локализации или программы могут использоваться и другие символы — точка с запятой, табуляция или вертикальная черта. Пример:\n\n```text\nИмя,Возраст,Город\nАнна,29,Москва\nИван,34,Самара\n```\n\n### Кавычки и экранирование\n\nЕсли значение содержит запятую, кавычку или перенос строки, его заключают в двойные кавычки:\n\n```text\n\"Анна, менеджер\",29,Москва\n```\n\nКавычки внутри значения удваиваются, чтобы программа не восприняла их как границы поля:\n\n```text\n\"Компания \"\"Ромашка\"\"\",2024,Санкт-Петербург\n```\n\n### Обработка разделителя внутри поля\n\nРазделитель, заключённый в кавычки, не считается границей поля. Это позволяет хранить значения, где запятая является частью текста.\n\n### Пустые поля\n\nЕсли значение отсутствует, поле оставляют пустым между разделителями:\n\n```text\nАнна,29,\nИван,,Самара\n```\n\nВ первом случае пустое поле в конце строки, во втором — в середине.\n\n### Перенос строки внутри полей\n\nЕсли в тексте встречается разрыв строки, он сохраняется, если значение заключено в кавычки:\n\n```text\n\"Комментарий:\nвторая строка\",123\n```\n\n### Варианты конца строки\n\nCSV поддерживает разные обозначения конца строки:\n\n* **CR** (`\\r`) — используется в старых системах macOS;\n* **LF** (`\\n`) — стандарт для Unix и Linux;\n* **CRLF** (`\\r\\n`) — используется в Windows.\n\n### Ограничения\n\nВсе строки в файле должны содержать одинаковое количество полей. Если где-то их больше или меньше, программа при импорте может «сдвинуть» столбцы и нарушить структуру таблицы.\n\n## Кодировки и символы\n\nРабота с CSV-файлами напрямую зависит от выбранной кодировки — способа, которым символы представляются в виде байтов. Если кодировка не совпадает между программами, текст может отображаться с ошибками: вместо букв появятся «кракозябры» или вопросительные знаки.\n\n\n\n### Unicode, UTF-8, UTF-16, ANSI и другие\n\nНаиболее распространённая кодировка для CSV сегодня — **UTF-8**, поскольку она поддерживает все языки и символы. Встречаются также **UTF-16** (в Windows) и **ANSI** (старая система, зависящая от локали).\n\n* **UTF-8** — универсальная кодировка, совместима с большинством систем и редакторов.\n* **UTF-16** — часто используется в Microsoft Excel, но может вызывать несовместимость при открытии файла в других программах.\n* **ANSI** — ограничена национальными наборами символов (например, Windows-1251 для кириллицы).\n\nПри работе с файлами из разных систем важно уточнять, в какой кодировке они сохранены, и при необходимости перекодировать их в UTF-8.\n\n### BOM (Byte Order Mark)\n\nНекоторые CSV-файлы, особенно созданные в Excel, содержат в начале невидимый символ BOM — **Byte Order Mark**. Он помогает программам определить, что файл записан в формате UTF-8 или UTF-16. Однако не все приложения обрабатывают BOM корректно. Например, при чтении файла в Python или других языках программирования BOM может восприниматься как часть первого поля.\n\n### Национальные и специальные символы\n\nCSV часто используется для хранения текстов на разных языках, поэтому важно, чтобы кодировка поддерживала национальные алфавиты — кириллицу, диакритические знаки, иероглифы. Кроме того, в таблицах нередко встречаются специальные символы вроде кавычек, запятых, знаков «;» или «|» — их нужно правильно экранировать с помощью кавычек, чтобы избежать ошибок при импорте.\n\n### Проблемы и решения\n\n* **Проблема:** при открытии файла в Excel вместо кириллицы отображаются вопросительные знаки.\n **Решение:** сохранить файл в UTF-8 без BOM или выбрать нужную кодировку при открытии.\n* **Проблема:** в первой ячейке появляется странный символ «ï» или «?» — это следствие некорректного чтения BOM.\n **Решение:** удалить BOM вручную или открыть файл с указанием параметра encoding='utf-8-sig'.\n\nСоблюдение единого стандарта кодировки (обычно UTF-8 без BOM) помогает избежать большинства проблем при работе с CSV-файлами на разных платформах.\n\n## Работа с CSV в языках и инструментах\n\nCSV-файлы поддерживаются практически во всех языках программирования и офисных приложениях. Это делает формат универсальным для интеграций, анализа данных и автоматизации процессов.\n\n### Python\n\nВ Python работа с CSV возможна двумя основными способами:\n\n**Модуль csv** — стандартная библиотека, позволяющая построчно читать и записывать данные:\n\n```python\nimport csv\n\nwith open('data.csv', encoding='utf-8') as f:\n reader = csv.reader(f)\n for row in reader:\n print(row)\n```\n\n***Pandas** — библиотека для анализа данных, которая автоматически определяет разделители и кодировки: \n\n```python\nimport pandas as pd\n\ndf = pd.read_csv('data.csv')\nprint(df.head())\n```\n\n### Java\n\nДля Java существует несколько популярных библиотек:\n\n* **OpenCSV** — простой инструмент для чтения и записи CSV-файлов:\n\n```java\nCSVReader reader = new CSVReader(new FileReader(\"data.csv\"));\nList<String[]> rows = reader.readAll();\n```\n\n* **Apache Commons CSV** — более гибкая библиотека, поддерживающая разные кодировки и форматирование.\n\n```java\nimport org.apache.commons.csv.CSVFormat;\nimport org.apache.commons.csv.CSVParser;\nimport org.apache.commons.csv.CSVRecord;\n\nimport java.io.FileReader;\nimport java.nio.charset.StandardCharsets;\n\npublic class CsvReadExample {\n public static void main(String[] args) throws Exception {\n try (CSVParser parser = CSVParser.parse(\n new FileReader(\"data.csv\", StandardCharsets.UTF_8),\n CSVFormat.DEFAULT.withFirstRecordAsHeader()\n )) {\n\n for (CSVRecord record : parser) {\n String name = record.get(\"name\");\n String age = record.get(\"age\");\n System.out.println(name + \" — \" + age);\n }\n }\n }\n}\n\n```\n\n### C# / .NET\n\nВ экосистеме .NET CSV можно обработать с помощью **TextFieldParser** из Microsoft.VisualBasic.FileIO или библиотек вроде **CsvHelper**:\n\n```csharp\nusing (var reader = new StreamReader(\"data.csv\"))\nusing (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))\n{\nvar records = csv.GetRecords<MyClass>().ToList();\n}\n```\n\n### JavaScript / Node.js\n\nНа стороне браузера CSV можно читать через FileReader, а в Node.js — использовать библиотеки **csv-parser** или **Papaparse**:\n\n```javascript\nimport csv from 'csv-parser'\nimport fs from 'fs'\n\nfs.createReadStream('data.csv')\n .pipe(csv())\n .on('data', (row) => console.log(row))\n```\n\n### Excel, LibreOffice, Google Sheets\n\nОфисные программы автоматически открывают CSV-файлы и позволяют выбирать разделитель и кодировку. Excel нередко добавляет BOM и точку с запятой вместо запятой в русской локали, поэтому при экспорте в другие системы стоит проверять настройки. Google Sheets корректно обрабатывает UTF-8 и умеет экспортировать данные обратно в CSV.\n\n### SQL и СУБД\n\nCSV часто используется для импорта и экспорта данных между базами.\n\n* В **MySQL** — команда:\n\n```sql\nLOAD DATA INFILE 'data.csv'\nINTO TABLE clients\nFIELDS TERMINATED BY ','\nENCLOSED BY '\"'\nIGNORE 1 ROWS;\n```\n\nВ **PostgreSQL** — аналогичная команда:\n\n```sql\nCOPY clients FROM 'data.csv' DELIMITER ',' CSV HEADER;\n```\n\nФормат удобен тем, что его можно легко преобразовать в таблицу без дополнительных инструментов и сложных зависимостей.\n\n## Обработка больших CSV / масштабируемость\n\n### Потоковая (ленивая) обработка\n\nКрупные CSV удобнее читать потоково: данные поступают построчно, без загрузки всего файла в память. В Python это csv.reader по открытому файловому объекту; в Node.js — стримы; в Java — BufferedReader или итераторы библиотек (OpenCSV, Commons CSV). Такой подход стабилен на файлах десятков гигабайт и позволяет сразу обрабатывать/писать результат.\n\n\n\n### Чтение по частям (чанки)\n\nКогда нужна табличная обработка, используют пакетную загрузку фиксированными порциями. В Pandas — read_csv(..., chunksize=100_000), в PostgreSQL — COPY в промежуточную таблицу по частям, в Spark/Dask — распределённые партиции. Чанки дают контроль над памятью и позволяют распараллеливать этапы (очистка, агрегации, запись).\n\n### Ограничения памяти\n\nКлючевые риски — попытка «распухнуть» датафрейм в RAM, дублирование структур, дорогое приведение типов. Практики: жёстко задавать типы столбцов при чтении, отключать авто-инференс, преобразовывать строки в категориальные, использовать генераторы/итераторы, временные файлы и поэтапную агрегацию (map → reduce).\n\n### Компрессия, архивирование, разделение на части\n\nСжатие уменьшает I/O и место на диске: gzip/bzip2/zstd читаются потоково большинством инструментов (Pandas compression='gzip', zstd; zcat | …). Для параллельной загрузки лучше хранить набором файлов (sharding: data_0001.csv.gz, data_0002.csv.gz) или партициями по дате/ключу. При экспорте фиксируйте одинаковую схему столбцов и одинаковый разделитель/кодировку во всех частях — это упростит последующую сборку и импорт.\n\n## Ошибки, исключения и безопасность\n\nРабота с CSV кажется простой, но даже в таком формате часто возникают ошибки, особенно при импорте и интеграции данных из разных систем.\n\n### Неправильное количество полей\n\nЕсли строки содержат разное число столбцов, программа может «сдвинуть» данные — значения окажутся не в тех колонках. Причина чаще всего в лишних разделителях или пропущенных кавычках. Проверять равномерность структуры стоит перед импортом с помощью валидации или предварительного просмотра.\n\n### Непарные кавычки\n\nКлассическая ошибка — когда поле открывается кавычкой, но не закрывается. В результате оставшаяся часть файла может восприниматься как одно длинное поле. Исправляется построчной проверкой или использованием специализированных парсеров, которые умеют восстанавливать структуру.\n\n### CSV-инъекции\n\nОпасная, но часто игнорируемая уязвимость. Если CSV открывается в Excel или Google Sheets, строка, начинающаяся с =, +, - или @, может интерпретироваться как формула. Это даёт злоумышленнику возможность внедрить вредоносные выражения вроде =HYPERLINK(\"http://phishing-site.com\").\n\nЧтобы избежать таких атак, все значения, начинающиеся с этих символов, следует экранировать или преобразовывать в текст — например, добавлять апостроф перед ними.\n\n### Неподходящие разделители\n\nИспользование запятой, точки с запятой или табуляции без согласования может привести к ошибкам при открытии файла в другой программе. Важно заранее определить символ-разделитель и явно указать его при экспорте и импорте.\n\n### Ошибки кодировок\n\nСамая частая причина искажённых символов. Разные системы используют разные кодировки — UTF-8, UTF-16, Windows-1251. При несовпадении отображаются «кракозябры». Оптимальный способ — всегда сохранять файлы в UTF-8 без BOM и при открытии явно указывать кодировку.\n\n## Сравнение CSV с альтернативами\n\nФормат CSV прост и универсален, но у него есть конкуренты, лучше подходящие для определённых задач.\n\n### JSON\n\nJSON хранит данные в виде пар «ключ–значение» и поддерживает вложенные структуры. Он удобен для передачи сложных объектов между веб-сервисами и приложениями. Однако для табличных данных JSON менее компактен и требует больше ресурсов при чтении.\n\n### XML\n\nXML использует теги и иерархическую структуру, что делает его гибким, но громоздким. Он подходит для систем, где важна валидация схемы и строгое описание данных. CSV выигрывает у XML в простоте и размере файлов.\n\n### Parquet, Avro, Feather\n\nЭти форматы применяются в аналитике и обработке больших данных. Они поддерживают сжатие, типизацию и эффективное чтение по столбцам. Parquet и Avro используют в Apache Spark, Hadoop, Snowflake. Однако для простого обмена таблицами они избыточны — CSV остаётся удобнее и понятнее.\n\n## Библиотеки, утилиты и инструменты\n\n**CLI-утилиты.**\n\n* csvkit — набор инструментов для анализа CSV в терминале: фильтрация, сортировка, конвертация.\n* csvtool, mlr (Miller) — лёгкие утилиты для построчной обработки больших файлов.\n\n**Графические редакторы.**\n\n* **Modern CSV**, **CSVed**, **Ron’s Editor **— позволяют редактировать таблицы без потери форматирования.\n* Веб-варианты — **ExtendsClass**, **CSV Viewer Online**, где можно открыть и править файл прямо в браузере.\n\n**Конверторы и онлайн-сервисы.**\n\n* Онлайн-инструменты для преобразования CSV в JSON, XML, Excel и обратно.\n* Утилиты Python (pandas.to_csv(), read_csv()) и Node.js (csvtojson) выполняют конвертацию программно.\n\n## Рекомендации и лучшие практики\n\n* Использовать **единообразный разделитель** (; или ,) и согласовать его с системой-получателем.\n* Всегда явно указывать **кодировку UTF-8 без BOM**.\n* Экранировать **кавычки и специальные символы** внутри текстовых полей.\n* Добавлять **строку заголовков** с понятными именами столбцов.\n* Перед импортом выполнять **валидацию**: проверять количество полей, кодировку и наличие непарных кавычек.\n\n## Заключение\n\nCSV остаётся самым доступным и гибким способом обмена табличными данными. Он не требует специализированных библиотек, читается в любом редакторе и легко интегрируется с системами.\n\nОднако у формата есть ограничения: отсутствие типизации, риск ошибок при кодировках и низкая надёжность при работе с большими объёмами данных.\n\nСовременные тенденции показывают, что CSV постепенно уступает место более структурированным форматам вроде Parquet и Avro, но сохраняет свою актуальность как лёгкий и понятный инструмент для быстрой передачи информации между приложениями.\n","votes_up_count":1,"votes_down_count":0,"created_at":"2025-11-18T12:18:45.015Z","user_id":104929,"category_slug":"glossary"}],"relatedQuestions":[{"creator":{"id":104929,"email":"feycot@gmail.com","first_name":"Nikolai","last_name":"Gagarinov","telegram":"","full_name":"Nikolai Gagarinov","removed":false},"category":{"id":15,"title":"Глоссарий","slug":"glossary","questions_count":382,"locale":"ru"},"tags":[],"id":6066,"answers_count":1,"slug":"naturalnye-chisla","state":"published","title":"Натуральные числа","created_at":"2025-11-11T13:31:08.571Z","details":null,"best_answer_id":5104,"related_stacks_count":0},{"creator":{"id":104929,"email":"feycot@gmail.com","first_name":"Nikolai","last_name":"Gagarinov","telegram":"","full_name":"Nikolai Gagarinov","removed":false},"category":{"id":15,"title":"Глоссарий","slug":"glossary","questions_count":382,"locale":"ru"},"tags":[],"id":6065,"answers_count":1,"slug":"correlation","state":"published","title":"Корреляция","created_at":"2025-11-11T13:22:24.537Z","details":null,"best_answer_id":null,"related_stacks_count":0},{"creator":{"id":104929,"email":"feycot@gmail.com","first_name":"Nikolai","last_name":"Gagarinov","telegram":"","full_name":"Nikolai Gagarinov","removed":false},"category":{"id":15,"title":"Глоссарий","slug":"glossary","questions_count":382,"locale":"ru"},"tags":[],"id":6064,"answers_count":1,"slug":"screenshot","state":"published","title":"Скриншот","created_at":"2025-11-11T12:34:03.203Z","details":null,"best_answer_id":null,"related_stacks_count":0},{"creator":{"id":104929,"email":"feycot@gmail.com","first_name":"Nikolai","last_name":"Gagarinov","telegram":"","full_name":"Nikolai Gagarinov","removed":false},"category":{"id":15,"title":"Глоссарий","slug":"glossary","questions_count":382,"locale":"ru"},"tags":[],"id":6031,"answers_count":1,"slug":"yandeks-metrika","state":"published","title":"Яндекс.Метрика","created_at":"2025-11-05T15:38:47.057Z","details":null,"best_answer_id":5064,"related_stacks_count":0},{"creator":{"id":198906,"email":"litvinovmksm@gmail.com","first_name":"Maksim","last_name":"Litvinov","telegram":"","full_name":"Maksim Litvinov","removed":false},"category":{"id":15,"title":"Глоссарий","slug":"glossary","questions_count":382,"locale":"ru"},"tags":[{"id":269,"slug":"http","name":"HTTP"}],"id":5891,"answers_count":1,"slug":"chto-takoe-upravlyayuschie-simvoly","state":"published","title":"Управляющие символы","created_at":"2025-01-27T06:43:15.646Z","details":"","best_answer_id":4680,"related_stacks_count":5}],"relatedLandings":[]},"url":"/qna/glossary/questions/chto-takoe-csv","version":"8f286f6358a90a7bef2263b3a6edf5a90a94fa42","encryptHistory":false,"clearHistory":false}"><style data-mantine-styles="true">:root, :host{--mantine-font-family: Arial, sans-serif;--mantine-font-family-headings: Arial, sans-serif;--mantine-heading-font-weight: normal;--mantine-radius-default: 0rem;--mantine-primary-color-filled: var(--mantine-color-indigo-filled);--mantine-primary-color-filled-hover: var(--mantine-color-indigo-filled-hover);--mantine-primary-color-light: var(--mantine-color-indigo-light);--mantine-primary-color-light-hover: var(--mantine-color-indigo-light-hover);--mantine-primary-color-light-color: var(--mantine-color-indigo-light-color);--mantine-spacing-xxl: calc(4rem * var(--mantine-scale));--mantine-font-size-xs: 12px;--mantine-font-size-sm: 14px;--mantine-font-size-md: 16px;--mantine-font-size-lg: clamp(16.0000px, calc(15.2727px + 0.2273vw), 18.0000px);--mantine-font-size-xl: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-font-size-display-3: clamp(32.0000px, calc(26.1818px + 1.8182vw), 48.0000px);--mantine-font-size-display-2: clamp(36.0000px, calc(25.8182px + 3.1818vw), 64.0000px);--mantine-font-size-display-1: clamp(40.0000px, calc(25.4545px + 4.5455vw), 80.0000px);--mantine-font-size-h1: clamp(28.0000px, calc(23.6364px + 1.3636vw), 40.0000px);--mantine-font-size-h2: clamp(24.0000px, calc(21.0909px + 0.9091vw), 32.0000px);--mantine-font-size-h3: clamp(20.0000px, calc(17.0909px + 0.9091vw), 28.0000px);--mantine-font-size-h4: clamp(16.0000px, calc(13.0909px + 0.9091vw), 24.0000px);--mantine-font-size-h5: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-font-size-h6: 1rem;--mantine-primary-color-0: var(--mantine-color-indigo-0);--mantine-primary-color-1: var(--mantine-color-indigo-1);--mantine-primary-color-2: var(--mantine-color-indigo-2);--mantine-primary-color-3: var(--mantine-color-indigo-3);--mantine-primary-color-4: var(--mantine-color-indigo-4);--mantine-primary-color-5: var(--mantine-color-indigo-5);--mantine-primary-color-6: var(--mantine-color-indigo-6);--mantine-primary-color-7: var(--mantine-color-indigo-7);--mantine-primary-color-8: var(--mantine-color-indigo-8);--mantine-primary-color-9: var(--mantine-color-indigo-9);--mantine-color-red-0: #ffeaea;--mantine-color-red-1: #fed4d4;--mantine-color-red-2: #f4a7a8;--mantine-color-red-3: #ec7878;--mantine-color-red-4: #e55050;--mantine-color-red-5: #e03131;--mantine-color-red-6: #e02829;--mantine-color-red-7: #c71a1c;--mantine-color-red-8: #b21218;--mantine-color-red-9: #9c0411;--mantine-color-violet-0: #fce9ff;--mantine-color-violet-1: #f1cfff;--mantine-color-violet-2: #e09bff;--mantine-color-violet-3: #d16fff;--mantine-color-violet-4: #be37fe;--mantine-color-violet-5: #b51afe;--mantine-color-violet-6: #b009ff;--mantine-color-violet-7: #9b00e4;--mantine-color-violet-8: #8a00cc;--mantine-color-violet-9: #7800b3;--mantine-color-indigo-0: #edecff;--mantine-color-indigo-1: #d6d5fe;--mantine-color-indigo-2: #aaa9f4;--mantine-color-indigo-3: #7b79eb;--mantine-color-indigo-4: #5451e4;--mantine-color-indigo-5: #3b37e0;--mantine-color-indigo-6: #2d2adf;--mantine-color-indigo-7: #1f1ec7;--mantine-color-indigo-8: #1819b2;--mantine-color-indigo-9: #0c149e;--mantine-color-cyan-0: #dffdff;--mantine-color-cyan-1: #caf5ff;--mantine-color-cyan-2: #99e8ff;--mantine-color-cyan-3: #64daff;--mantine-color-cyan-4: #3ccffe;--mantine-color-cyan-5: #24c8fe;--mantine-color-cyan-6: #00c2ff;--mantine-color-cyan-7: #00ade4;--mantine-color-cyan-8: #009acd;--mantine-color-cyan-9: #0085b5;--mantine-color-green-0: #e9fdec;--mantine-color-green-1: #d7f6dc;--mantine-color-green-2: #b0eab9;--mantine-color-green-3: #86df94;--mantine-color-green-4: #62d574;--mantine-color-green-5: #4ccf5f;--mantine-color-green-6: #3fcc54;--mantine-color-green-7: #2fb344;--mantine-color-green-8: #25a03b;--mantine-color-green-9: #138a2e;--mantine-color-yellow-0: #fff7e2;--mantine-color-yellow-1: #ffeecd;--mantine-color-yellow-2: #ffdc9c;--mantine-color-yellow-3: #ffc966;--mantine-color-yellow-4: #feb93a;--mantine-color-yellow-5: #feae1e;--mantine-color-yellow-6: #ffa90f;--mantine-color-yellow-8: #ca8200;--mantine-color-yellow-9: #af7000;--mantine-h1-font-size: clamp(28.0000px, calc(23.6364px + 1.3636vw), 40.0000px);--mantine-h1-font-weight: normal;--mantine-h2-font-size: clamp(24.0000px, calc(21.0909px + 0.9091vw), 32.0000px);--mantine-h2-font-weight: normal;--mantine-h3-font-size: clamp(20.0000px, calc(17.0909px + 0.9091vw), 28.0000px);--mantine-h3-font-weight: normal;--mantine-h4-font-size: clamp(16.0000px, calc(13.0909px + 0.9091vw), 24.0000px);--mantine-h4-font-weight: normal;--mantine-h5-font-size: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-h5-font-weight: normal;--mantine-h6-font-size: 1rem;--mantine-h6-font-weight: normal;}
:root[data-mantine-color-scheme="dark"], :host([data-mantine-color-scheme="dark"]){--mantine-color-anchor: var(--mantine-color-text);--mantine-color-dimmed: #495057;--mantine-color-dark-filled: var(--mantine-color-dark-5);--mantine-color-dark-filled-hover: var(--mantine-color-dark-6);--mantine-color-dark-light: rgba(105, 105, 105, 0.15);--mantine-color-dark-light-hover: rgba(105, 105, 105, 0.2);--mantine-color-dark-light-color: var(--mantine-color-dark-0);--mantine-color-dark-outline: var(--mantine-color-dark-1);--mantine-color-dark-outline-hover: rgba(184, 184, 184, 0.05);--mantine-color-gray-filled: var(--mantine-color-gray-5);--mantine-color-gray-filled-hover: var(--mantine-color-gray-6);--mantine-color-gray-light: rgba(222, 226, 230, 0.15);--mantine-color-gray-light-hover: rgba(222, 226, 230, 0.2);--mantine-color-gray-light-color: var(--mantine-color-gray-0);--mantine-color-gray-outline: var(--mantine-color-gray-1);--mantine-color-gray-outline-hover: rgba(241, 243, 245, 0.05);--mantine-color-red-filled: var(--mantine-color-red-5);--mantine-color-red-filled-hover: var(--mantine-color-red-6);--mantine-color-red-light: rgba(236, 120, 120, 0.15);--mantine-color-red-light-hover: rgba(236, 120, 120, 0.2);--mantine-color-red-light-color: var(--mantine-color-red-0);--mantine-color-red-outline: var(--mantine-color-red-1);--mantine-color-red-outline-hover: rgba(254, 212, 212, 0.05);--mantine-color-pink-filled: var(--mantine-color-pink-5);--mantine-color-pink-filled-hover: var(--mantine-color-pink-6);--mantine-color-pink-light: rgba(250, 162, 193, 0.15);--mantine-color-pink-light-hover: rgba(250, 162, 193, 0.2);--mantine-color-pink-light-color: var(--mantine-color-pink-0);--mantine-color-pink-outline: var(--mantine-color-pink-1);--mantine-color-pink-outline-hover: rgba(255, 222, 235, 0.05);--mantine-color-grape-filled: var(--mantine-color-grape-5);--mantine-color-grape-filled-hover: var(--mantine-color-grape-6);--mantine-color-grape-light: rgba(229, 153, 247, 0.15);--mantine-color-grape-light-hover: rgba(229, 153, 247, 0.2);--mantine-color-grape-light-color: var(--mantine-color-grape-0);--mantine-color-grape-outline: var(--mantine-color-grape-1);--mantine-color-grape-outline-hover: rgba(243, 217, 250, 0.05);--mantine-color-violet-filled: var(--mantine-color-violet-5);--mantine-color-violet-filled-hover: var(--mantine-color-violet-6);--mantine-color-violet-light: rgba(209, 111, 255, 0.15);--mantine-color-violet-light-hover: rgba(209, 111, 255, 0.2);--mantine-color-violet-light-color: var(--mantine-color-violet-0);--mantine-color-violet-outline: var(--mantine-color-violet-1);--mantine-color-violet-outline-hover: rgba(241, 207, 255, 0.05);--mantine-color-indigo-filled: var(--mantine-color-indigo-5);--mantine-color-indigo-filled-hover: var(--mantine-color-indigo-6);--mantine-color-indigo-light: rgba(123, 121, 235, 0.15);--mantine-color-indigo-light-hover: rgba(123, 121, 235, 0.2);--mantine-color-indigo-light-color: var(--mantine-color-indigo-0);--mantine-color-indigo-outline: var(--mantine-color-indigo-1);--mantine-color-indigo-outline-hover: rgba(214, 213, 254, 0.05);--mantine-color-blue-filled: var(--mantine-color-blue-5);--mantine-color-blue-filled-hover: var(--mantine-color-blue-6);--mantine-color-blue-light: rgba(116, 192, 252, 0.15);--mantine-color-blue-light-hover: rgba(116, 192, 252, 0.2);--mantine-color-blue-light-color: var(--mantine-color-blue-0);--mantine-color-blue-outline: var(--mantine-color-blue-1);--mantine-color-blue-outline-hover: rgba(208, 235, 255, 0.05);--mantine-color-cyan-filled: var(--mantine-color-cyan-5);--mantine-color-cyan-filled-hover: var(--mantine-color-cyan-6);--mantine-color-cyan-light: rgba(100, 218, 255, 0.15);--mantine-color-cyan-light-hover: rgba(100, 218, 255, 0.2);--mantine-color-cyan-light-color: var(--mantine-color-cyan-0);--mantine-color-cyan-outline: var(--mantine-color-cyan-1);--mantine-color-cyan-outline-hover: rgba(202, 245, 255, 0.05);--mantine-color-teal-filled: var(--mantine-color-teal-5);--mantine-color-teal-filled-hover: var(--mantine-color-teal-6);--mantine-color-teal-light: rgba(99, 230, 190, 0.15);--mantine-color-teal-light-hover: rgba(99, 230, 190, 0.2);--mantine-color-teal-light-color: var(--mantine-color-teal-0);--mantine-color-teal-outline: var(--mantine-color-teal-1);--mantine-color-teal-outline-hover: rgba(195, 250, 232, 0.05);--mantine-color-green-filled: var(--mantine-color-green-5);--mantine-color-green-filled-hover: var(--mantine-color-green-6);--mantine-color-green-light: rgba(134, 223, 148, 0.15);--mantine-color-green-light-hover: rgba(134, 223, 148, 0.2);--mantine-color-green-light-color: var(--mantine-color-green-0);--mantine-color-green-outline: var(--mantine-color-green-1);--mantine-color-green-outline-hover: rgba(215, 246, 220, 0.05);--mantine-color-lime-filled: var(--mantine-color-lime-5);--mantine-color-lime-filled-hover: var(--mantine-color-lime-6);--mantine-color-lime-light: rgba(192, 235, 117, 0.15);--mantine-color-lime-light-hover: rgba(192, 235, 117, 0.2);--mantine-color-lime-light-color: var(--mantine-color-lime-0);--mantine-color-lime-outline: var(--mantine-color-lime-1);--mantine-color-lime-outline-hover: rgba(233, 250, 200, 0.05);--mantine-color-yellow-filled: var(--mantine-color-yellow-5);--mantine-color-yellow-filled-hover: var(--mantine-color-yellow-6);--mantine-color-yellow-light: rgba(255, 201, 102, 0.15);--mantine-color-yellow-light-hover: rgba(255, 201, 102, 0.2);--mantine-color-yellow-light-color: var(--mantine-color-yellow-0);--mantine-color-yellow-outline: var(--mantine-color-yellow-1);--mantine-color-yellow-outline-hover: rgba(255, 238, 205, 0.05);--mantine-color-orange-filled: var(--mantine-color-orange-5);--mantine-color-orange-filled-hover: var(--mantine-color-orange-6);--mantine-color-orange-light: rgba(255, 192, 120, 0.15);--mantine-color-orange-light-hover: rgba(255, 192, 120, 0.2);--mantine-color-orange-light-color: var(--mantine-color-orange-0);--mantine-color-orange-outline: var(--mantine-color-orange-1);--mantine-color-orange-outline-hover: rgba(255, 232, 204, 0.05);--app-cta-gradient: linear-gradient(90deg, var(--mantine-color-blue-9) 0%, var(--mantine-color-cyan-7) 100%);--app-color-surface: #2e2e2e;}
:root[data-mantine-color-scheme="light"], :host([data-mantine-color-scheme="light"]){--mantine-color-anchor: var(--mantine-color-text);--mantine-color-dimmed: #495057;--mantine-color-red-light: rgba(224, 40, 41, 0.1);--mantine-color-red-light-hover: rgba(224, 40, 41, 0.12);--mantine-color-red-outline-hover: rgba(224, 40, 41, 0.05);--mantine-color-violet-light: rgba(176, 9, 255, 0.1);--mantine-color-violet-light-hover: rgba(176, 9, 255, 0.12);--mantine-color-violet-outline-hover: rgba(176, 9, 255, 0.05);--mantine-color-indigo-light: rgba(45, 42, 223, 0.1);--mantine-color-indigo-light-hover: rgba(45, 42, 223, 0.12);--mantine-color-indigo-outline-hover: rgba(45, 42, 223, 0.05);--mantine-color-cyan-light: rgba(0, 194, 255, 0.1);--mantine-color-cyan-light-hover: rgba(0, 194, 255, 0.12);--mantine-color-cyan-outline-hover: rgba(0, 194, 255, 0.05);--mantine-color-green-light: rgba(63, 204, 84, 0.1);--mantine-color-green-light-hover: rgba(63, 204, 84, 0.12);--mantine-color-green-outline-hover: rgba(63, 204, 84, 0.05);--mantine-color-yellow-light: rgba(255, 169, 15, 0.1);--mantine-color-yellow-light-hover: rgba(255, 169, 15, 0.12);--mantine-color-yellow-outline-hover: rgba(255, 169, 15, 0.05);--app-color-surface: #f1f3f5;--app-cta-gradient: linear-gradient(90deg, var(--mantine-color-blue-filled) 0%, var(--mantine-color-cyan-5) 100%);}</style><style data-mantine-styles="classes">@media (max-width: 35.99375em) {.mantine-visible-from-xs {display: none !important;}}@media (min-width: 36em) {.mantine-hidden-from-xs {display: none !important;}}@media (max-width: 47.99375em) {.mantine-visible-from-sm {display: none !important;}}@media (min-width: 48em) {.mantine-hidden-from-sm {display: none !important;}}@media (max-width: 61.99375em) {.mantine-visible-from-md {display: none !important;}}@media (min-width: 62em) {.mantine-hidden-from-md {display: none !important;}}@media (max-width: 74.99375em) {.mantine-visible-from-lg {display: none !important;}}@media (min-width: 75em) {.mantine-hidden-from-lg {display: none !important;}}@media (max-width: 87.99375em) {.mantine-visible-from-xl {display: none !important;}}@media (min-width: 88em) {.mantine-hidden-from-xl {display: none !important;}}</style><script type="application/ld+json">{"@context":"https://schema.org","@type":"QAPage","mainEntity":{"@type":"Question","name":"CSV","answerCount":1,"datePublished":"2025-11-18T12:18:19.575Z","author":{"@type":"Person","name":"Nikolai Gagarinov"},"acceptedAnswer":{"@type":"Answer","text":"\nCSV (Comma-Separated Values) — это минималистичный текстовый формат, созданный для хранения и передачи табличных данных между разными системами. Каждая строка в таком файле представляет собой отдельную запись, а значения внутри неё разделяются символами — чаще запятой, но нередко и точкой с запятой, табуляцией или другим разделителем. Этот формат не нуждается в сложной структуре: данные можно прочитать в обычном текстовом редакторе, а программы — импортировать их без дополнительных настроек.\n\n\n\nCSV применяют, когда нужно быстро и без потерь обменяться таблицей между системами. Например, экспортировать отчёт из бухгалтерии в Excel, перенести список клиентов из CRM в Google Sheets или выгрузить данные из базы в аналитическую платформу. Формат универсален: он не зависит от программного окружения и поддерживается практически везде, где можно открыть текстовый файл.\n\nИстория CSV восходит к первым электронным таблицам и базам данных конца 1970-х. Тогда, на фоне несовместимости программ, формат стал простейшим способом обмена структурированными данными. За десятилетия он не утратил актуальности: несмотря на появление JSON, XML и XLSX, CSV остаётся рабочим стандартом для переноса таблиц — лёгким, прозрачным и свободным от привязки к конкретным системам.\n\n## Спецификация и стандарты\n\nХотя CSV считается простым форматом, у него есть формальное описание — **RFC 4180**, опубликованное в 2005 году. Этот документ не делает формат жёстко стандартизированным, но описывает основные принципы, которые помогают программам корректно обмениваться данными.\n\n### RFC 4180: ключевые положения\n\n* Каждая строка файла — отдельная запись (обычно соответствует строке таблицы).\n* Поля внутри строки разделяются запятой, однако допускается использование других символов, например точки с запятой или табуляции.\n* Текстовые значения можно заключать в кавычки "...", особенно если внутри встречаются запятые, кавычки или переводы строк.\n* Кавычки внутри значения должны дублироваться: `"Company ""ABC"" Ltd"`.\n* Перенос строк — `CRLF` (Windows) или `LF` (Unix), в зависимости от системы.\n\n### Когда стандарт обязателен, а когда есть допущения\n\nRFC 4180 носит рекомендательный характер. Программы и сервисы могут использовать собственные разделители, кодировки или способы экранирования. Например, Excel в русской локализации применяет точку с запятой вместо запятой, чтобы избежать конфликта с десятичным разделителем.\n\n### Несовместимости и расхождения\n\nИменно из-за отсутствия строгого единого стандарта CSV-файлы могут вести себя по-разному:\n\n* различаются разделители (`;`, `,`, `\\t`);\n* встречаются разные кодировки (UTF-8, Windows-1251);\n* некоторые программы добавляют лишние кавычки или пропускают их вовсе.\n\nЭти мелкие отличия нередко вызывают ошибки при импорте или экспорте данных, особенно между системами, созданными в разных странах или на разных языках. Поэтому перед использованием CSV важно проверять настройки разделителя и кодировку.\n\n## Синтаксис CSV: базовые правила\n\nФормат CSV выглядит просто, но имеет ряд правил, которые обеспечивают корректное чтение и запись данных. Нарушение этих правил может привести к смещению столбцов, потере информации или ошибкам импорта.\n\n### Строки и поля, разделители\n\nКаждая строка файла соответствует одной записи таблицы. Поля внутри строки разделяются запятой, но в зависимости от локализации или программы могут использоваться и другие символы — точка с запятой, табуляция или вертикальная черта. Пример:\n\n```text\nИмя,Возраст,Город\nАнна,29,Москва\nИван,34,Самара\n```\n\n### Кавычки и экранирование\n\nЕсли значение содержит запятую, кавычку или перенос строки, его заключают в двойные кавычки:\n\n```text\n"Анна, менеджер",29,Москва\n```\n\nКавычки внутри значения удваиваются, чтобы программа не восприняла их как границы поля:\n\n```text\n"Компания ""Ромашка""",2024,Санкт-Петербург\n```\n\n### Обработка разделителя внутри поля\n\nРазделитель, заключённый в кавычки, не считается границей поля. Это позволяет хранить значения, где запятая является частью текста.\n\n### Пустые поля\n\nЕсли значение отсутствует, поле оставляют пустым между разделителями:\n\n```text\nАнна,29,\nИван,,Самара\n```\n\nВ первом случае пустое поле в конце строки, во втором — в середине.\n\n### Перенос строки внутри полей\n\nЕсли в тексте встречается разрыв строки, он сохраняется, если значение заключено в кавычки:\n\n```text\n"Комментарий:\nвторая строка",123\n```\n\n### Варианты конца строки\n\nCSV поддерживает разные обозначения конца строки:\n\n* **CR** (`\\r`) — используется в старых системах macOS;\n* **LF** (`\\n`) — стандарт для Unix и Linux;\n* **CRLF** (`\\r\\n`) — используется в Windows.\n\n### Ограничения\n\nВсе строки в файле должны содержать одинаковое количество полей. Если где-то их больше или меньше, программа при импорте может «сдвинуть» столбцы и нарушить структуру таблицы.\n\n## Кодировки и символы\n\nРабота с CSV-файлами напрямую зависит от выбранной кодировки — способа, которым символы представляются в виде байтов. Если кодировка не совпадает между программами, текст может отображаться с ошибками: вместо букв появятся «кракозябры» или вопросительные знаки.\n\n\n\n### Unicode, UTF-8, UTF-16, ANSI и другие\n\nНаиболее распространённая кодировка для CSV сегодня — **UTF-8**, поскольку она поддерживает все языки и символы. Встречаются также **UTF-16** (в Windows) и **ANSI** (старая система, зависящая от локали).\n\n* **UTF-8** — универсальная кодировка, совместима с большинством систем и редакторов.\n* **UTF-16** — часто используется в Microsoft Excel, но может вызывать несовместимость при открытии файла в других программах.\n* **ANSI** — ограничена национальными наборами символов (например, Windows-1251 для кириллицы).\n\nПри работе с файлами из разных систем важно уточнять, в какой кодировке они сохранены, и при необходимости перекодировать их в UTF-8.\n\n### BOM (Byte Order Mark)\n\nНекоторые CSV-файлы, особенно созданные в Excel, содержат в начале невидимый символ BOM — **Byte Order Mark**. Он помогает программам определить, что файл записан в формате UTF-8 или UTF-16. Однако не все приложения обрабатывают BOM корректно. Например, при чтении файла в Python или других языках программирования BOM может восприниматься как часть первого поля.\n\n### Национальные и специальные символы\n\nCSV часто используется для хранения текстов на разных языках, поэтому важно, чтобы кодировка поддерживала национальные алфавиты — кириллицу, диакритические знаки, иероглифы. Кроме того, в таблицах нередко встречаются специальные символы вроде кавычек, запятых, знаков «;» или «|» — их нужно правильно экранировать с помощью кавычек, чтобы избежать ошибок при импорте.\n\n### Проблемы и решения\n\n* **Проблема:** при открытии файла в Excel вместо кириллицы отображаются вопросительные знаки.\n **Решение:** сохранить файл в UTF-8 без BOM или выбрать нужную кодировку при открытии.\n* **Проблема:** в первой ячейке появляется странный символ «ï» или «?» — это следствие некорректного чтения BOM.\n **Решение:** удалить BOM вручную или открыть файл с указанием параметра encoding='utf-8-sig'.\n\nСоблюдение единого стандарта кодировки (обычно UTF-8 без BOM) помогает избежать большинства проблем при работе с CSV-файлами на разных платформах.\n\n## Работа с CSV в языках и инструментах\n\nCSV-файлы поддерживаются практически во всех языках программирования и офисных приложениях. Это делает формат универсальным для интеграций, анализа данных и автоматизации процессов.\n\n### Python\n\nВ Python работа с CSV возможна двумя основными способами:\n\n**Модуль csv** — стандартная библиотека, позволяющая построчно читать и записывать данные:\n\n```python\nimport csv\n\nwith open('data.csv', encoding='utf-8') as f:\n reader = csv.reader(f)\n for row in reader:\n print(row)\n```\n\n***Pandas** — библиотека для анализа данных, которая автоматически определяет разделители и кодировки: \n\n```python\nimport pandas as pd\n\ndf = pd.read_csv('data.csv')\nprint(df.head())\n```\n\n### Java\n\nДля Java существует несколько популярных библиотек:\n\n* **OpenCSV** — простой инструмент для чтения и записи CSV-файлов:\n\n```java\nCSVReader reader = new CSVReader(new FileReader("data.csv"));\nList<String[]> rows = reader.readAll();\n```\n\n* **Apache Commons CSV** — более гибкая библиотека, поддерживающая разные кодировки и форматирование.\n\n```java\nimport org.apache.commons.csv.CSVFormat;\nimport org.apache.commons.csv.CSVParser;\nimport org.apache.commons.csv.CSVRecord;\n\nimport java.io.FileReader;\nimport java.nio.charset.StandardCharsets;\n\npublic class CsvReadExample {\n public static void main(String[] args) throws Exception {\n try (CSVParser parser = CSVParser.parse(\n new FileReader("data.csv", StandardCharsets.UTF_8),\n CSVFormat.DEFAULT.withFirstRecordAsHeader()\n )) {\n\n for (CSVRecord record : parser) {\n String name = record.get("name");\n String age = record.get("age");\n System.out.println(name + " — " + age);\n }\n }\n }\n}\n\n```\n\n### C# / .NET\n\nВ экосистеме .NET CSV можно обработать с помощью **TextFieldParser** из Microsoft.VisualBasic.FileIO или библиотек вроде **CsvHelper**:\n\n```csharp\nusing (var reader = new StreamReader("data.csv"))\nusing (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))\n{\nvar records = csv.GetRecords<MyClass>().ToList();\n}\n```\n\n### JavaScript / Node.js\n\nНа стороне браузера CSV можно читать через FileReader, а в Node.js — использовать библиотеки **csv-parser** или **Papaparse**:\n\n```javascript\nimport csv from 'csv-parser'\nimport fs from 'fs'\n\nfs.createReadStream('data.csv')\n .pipe(csv())\n .on('data', (row) => console.log(row))\n```\n\n### Excel, LibreOffice, Google Sheets\n\nОфисные программы автоматически открывают CSV-файлы и позволяют выбирать разделитель и кодировку. Excel нередко добавляет BOM и точку с запятой вместо запятой в русской локали, поэтому при экспорте в другие системы стоит проверять настройки. Google Sheets корректно обрабатывает UTF-8 и умеет экспортировать данные обратно в CSV.\n\n### SQL и СУБД\n\nCSV часто используется для импорта и экспорта данных между базами.\n\n* В **MySQL** — команда:\n\n```sql\nLOAD DATA INFILE 'data.csv'\nINTO TABLE clients\nFIELDS TERMINATED BY ','\nENCLOSED BY '"'\nIGNORE 1 ROWS;\n```\n\nВ **PostgreSQL** — аналогичная команда:\n\n```sql\nCOPY clients FROM 'data.csv' DELIMITER ',' CSV HEADER;\n```\n\nФормат удобен тем, что его можно легко преобразовать в таблицу без дополнительных инструментов и сложных зависимостей.\n\n## Обработка больших CSV / масштабируемость\n\n### Потоковая (ленивая) обработка\n\nКрупные CSV удобнее читать потоково: данные поступают построчно, без загрузки всего файла в память. В Python это csv.reader по открытому файловому объекту; в Node.js — стримы; в Java — BufferedReader или итераторы библиотек (OpenCSV, Commons CSV). Такой подход стабилен на файлах десятков гигабайт и позволяет сразу обрабатывать/писать результат.\n\n\n\n### Чтение по частям (чанки)\n\nКогда нужна табличная обработка, используют пакетную загрузку фиксированными порциями. В Pandas — read_csv(..., chunksize=100_000), в PostgreSQL — COPY в промежуточную таблицу по частям, в Spark/Dask — распределённые партиции. Чанки дают контроль над памятью и позволяют распараллеливать этапы (очистка, агрегации, запись).\n\n### Ограничения памяти\n\nКлючевые риски — попытка «распухнуть» датафрейм в RAM, дублирование структур, дорогое приведение типов. Практики: жёстко задавать типы столбцов при чтении, отключать авто-инференс, преобразовывать строки в категориальные, использовать генераторы/итераторы, временные файлы и поэтапную агрегацию (map → reduce).\n\n### Компрессия, архивирование, разделение на части\n\nСжатие уменьшает I/O и место на диске: gzip/bzip2/zstd читаются потоково большинством инструментов (Pandas compression='gzip', zstd; zcat | …). Для параллельной загрузки лучше хранить набором файлов (sharding: data_0001.csv.gz, data_0002.csv.gz) или партициями по дате/ключу. При экспорте фиксируйте одинаковую схему столбцов и одинаковый разделитель/кодировку во всех частях — это упростит последующую сборку и импорт.\n\n## Ошибки, исключения и безопасность\n\nРабота с CSV кажется простой, но даже в таком формате часто возникают ошибки, особенно при импорте и интеграции данных из разных систем.\n\n### Неправильное количество полей\n\nЕсли строки содержат разное число столбцов, программа может «сдвинуть» данные — значения окажутся не в тех колонках. Причина чаще всего в лишних разделителях или пропущенных кавычках. Проверять равномерность структуры стоит перед импортом с помощью валидации или предварительного просмотра.\n\n### Непарные кавычки\n\nКлассическая ошибка — когда поле открывается кавычкой, но не закрывается. В результате оставшаяся часть файла может восприниматься как одно длинное поле. Исправляется построчной проверкой или использованием специализированных парсеров, которые умеют восстанавливать структуру.\n\n### CSV-инъекции\n\nОпасная, но часто игнорируемая уязвимость. Если CSV открывается в Excel или Google Sheets, строка, начинающаяся с =, +, - или @, может интерпретироваться как формула. Это даёт злоумышленнику возможность внедрить вредоносные выражения вроде =HYPERLINK("http://phishing-site.com").\n\nЧтобы избежать таких атак, все значения, начинающиеся с этих символов, следует экранировать или преобразовывать в текст — например, добавлять апостроф перед ними.\n\n### Неподходящие разделители\n\nИспользование запятой, точки с запятой или табуляции без согласования может привести к ошибкам при открытии файла в другой программе. Важно заранее определить символ-разделитель и явно указать его при экспорте и импорте.\n\n### Ошибки кодировок\n\nСамая частая причина искажённых символов. Разные системы используют разные кодировки — UTF-8, UTF-16, Windows-1251. При несовпадении отображаются «кракозябры». Оптимальный способ — всегда сохранять файлы в UTF-8 без BOM и при открытии явно указывать кодировку.\n\n## Сравнение CSV с альтернативами\n\nФормат CSV прост и универсален, но у него есть конкуренты, лучше подходящие для определённых задач.\n\n### JSON\n\nJSON хранит данные в виде пар «ключ–значение» и поддерживает вложенные структуры. Он удобен для передачи сложных объектов между веб-сервисами и приложениями. Однако для табличных данных JSON менее компактен и требует больше ресурсов при чтении.\n\n### XML\n\nXML использует теги и иерархическую структуру, что делает его гибким, но громоздким. Он подходит для систем, где важна валидация схемы и строгое описание данных. CSV выигрывает у XML в простоте и размере файлов.\n\n### Parquet, Avro, Feather\n\nЭти форматы применяются в аналитике и обработке больших данных. Они поддерживают сжатие, типизацию и эффективное чтение по столбцам. Parquet и Avro используют в Apache Spark, Hadoop, Snowflake. Однако для простого обмена таблицами они избыточны — CSV остаётся удобнее и понятнее.\n\n## Библиотеки, утилиты и инструменты\n\n**CLI-утилиты.**\n\n* csvkit — набор инструментов для анализа CSV в терминале: фильтрация, сортировка, конвертация.\n* csvtool, mlr (Miller) — лёгкие утилиты для построчной обработки больших файлов.\n\n**Графические редакторы.**\n\n* **Modern CSV**, **CSVed**, **Ron’s Editor **— позволяют редактировать таблицы без потери форматирования.\n* Веб-варианты — **ExtendsClass**, **CSV Viewer Online**, где можно открыть и править файл прямо в браузере.\n\n**Конверторы и онлайн-сервисы.**\n\n* Онлайн-инструменты для преобразования CSV в JSON, XML, Excel и обратно.\n* Утилиты Python (pandas.to_csv(), read_csv()) и Node.js (csvtojson) выполняют конвертацию программно.\n\n## Рекомендации и лучшие практики\n\n* Использовать **единообразный разделитель** (; или ,) и согласовать его с системой-получателем.\n* Всегда явно указывать **кодировку UTF-8 без BOM**.\n* Экранировать **кавычки и специальные символы** внутри текстовых полей.\n* Добавлять **строку заголовков** с понятными именами столбцов.\n* Перед импортом выполнять **валидацию**: проверять количество полей, кодировку и наличие непарных кавычек.\n\n## Заключение\n\nCSV остаётся самым доступным и гибким способом обмена табличными данными. Он не требует специализированных библиотек, читается в любом редакторе и легко интегрируется с системами.\n\nОднако у формата есть ограничения: отсутствие типизации, риск ошибок при кодировках и низкая надёжность при работе с большими объёмами данных.\n\nСовременные тенденции показывают, что CSV постепенно уступает место более структурированным форматам вроде Parquet и Avro, но сохраняет свою актуальность как лёгкий и понятный инструмент для быстрой передачи информации между приложениями.\n","datePublished":"2025-11-18T12:18:45.015Z","upvoteCount":1,"author":{"@type":"Person","name":"Nikolai Gagarinov"},"url":"https://ru.hexlet.io/qna/glossary/questions/chto-takoe-csv#answer-5152"}}}</script><div style="--container-size:var(--container-size-lg);margin-top:var(--mantine-spacing-xl);height:100%" class="m_7485cace mantine-Container-root" data-size="lg" data-strategy="block"><script type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"position":1,"@type":"ListItem","item":{"@id":"/qna","name":"Вопросы и ответы"}},{"position":2,"@type":"ListItem","item":{"@id":"/qna/glossary/questions","name":"Глоссарий"}},{"position":3,"@type":"ListItem","item":{"@id":"/qna/glossary/questions/chto-takoe-csv","name":"CSV"}}]}</script><div style="margin-bottom:var(--mantine-spacing-xs)" class="m_8b3717df mantine-Breadcrumbs-root"><a style="--text-fz:var(--mantine-font-size-sm);--text-lh:var(--mantine-line-height-sm);white-space:normal;color:inherit" class="mantine-focus-auto m_849cf0da m_f678d540 mantine-Breadcrumbs-breadcrumb m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-size="sm" data-underline="hover" href="/"><div style="color:inherit" class="m_4451eb3a mantine-Center-root"><svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-home-link "><path d="M20.085 11.085l-8.085 -8.085l-9 9h2v7a2 2 0 0 0 2 2h4.5"></path><path d="M9 21v-6a2 2 0 0 1 2 -2h2a2 2 0 0 1 1.807 1.143"></path><path d="M20 21a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path><path d="M20 16a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path><path d="M15 19a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path><path d="M21 16l-5 3l5 2"></path></svg></div></a><div class="m_3b8f2208 mantine-Breadcrumbs-separator">/</div><a style="--text-fz:var(--mantine-font-size-sm);--text-lh:var(--mantine-line-height-sm);white-space:normal;color:inherit" class="mantine-focus-auto m_849cf0da m_f678d540 mantine-Breadcrumbs-breadcrumb m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-size="sm" data-underline="hover" href="/qna">Вопросы и ответы</a><div class="m_3b8f2208 mantine-Breadcrumbs-separator">/</div><a style="--text-fz:var(--mantine-font-size-sm);--text-lh:var(--mantine-line-height-sm);white-space:normal;color:inherit" class="mantine-focus-auto m_849cf0da m_f678d540 mantine-Breadcrumbs-breadcrumb m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-size="sm" data-underline="hover" href="/qna/glossary/questions">Глоссарий</a><div class="m_3b8f2208 mantine-Breadcrumbs-separator">/</div><p style="--text-fz:var(--mantine-font-size-sm);--text-lh:var(--mantine-line-height-sm);white-space:normal;color:var(--mantine-color-dimmed)" class="mantine-focus-auto m_f678d540 mantine-Breadcrumbs-breadcrumb m_b6d8b162 mantine-Text-root" data-size="sm">CSV</p></div><style data-mantine-styles="inline">.__m__-_R_eub_{margin-bottom:var(--mantine-spacing-xs);}@media(min-width: 36em){.__m__-_R_eub_{margin-bottom:var(--mantine-spacing-xs);}}</style><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root __m__-_R_eub_"><style data-mantine-styles="inline">.__m__-_R_deub_{width:100%;}@media(min-width: 36em){.__m__-_R_deub_{width:70%;}}@media(min-width: 75em){.__m__-_R_deub_{width:75%;}}</style><div class="__m__-_R_deub_"><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><h1 style="--title-fw:var(--mantine-h1-font-weight);--title-lh:var(--mantine-h1-line-height);--title-fz:var(--mantine-h1-font-size)" class="m_8a5d1357 mantine-Title-root" data-order="1">CSV</h1></div></div></div><style data-mantine-styles="inline">.__m__-_R_iub_{--grid-gutter:var(--mantine-spacing-md);}</style><div class="m_410352e9 mantine-Grid-root __m__-_R_iub_"><div class="m_dee7bd2f mantine-Grid-inner"><style data-mantine-styles="inline">.__m__-_R_3diub_{--col-flex-grow:auto;--col-flex-basis:100%;--col-max-width:100%;}@media(min-width: 48em){.__m__-_R_3diub_{--col-flex-grow:auto;--col-flex-basis:83.33333333333334%;--col-max-width:83.33333333333334%;}}@media(min-width: 62em){.__m__-_R_3diub_{--col-flex-grow:auto;--col-flex-basis:66.66666666666667%;--col-max-width:66.66666666666667%;}}</style><div class="m_96bdd299 mantine-Grid-col __m__-_R_3diub_"><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:flex-start;--group-wrap:wrap;margin-bottom:var(--mantine-spacing-lg)" class="m_4081bf90 mantine-Group-root"></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:flex-start;--group-wrap:wrap;margin-bottom:var(--mantine-spacing-xl);font-size:var(--mantine-font-size-sm)" class="m_4081bf90 mantine-Group-root"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:wrap;margin-inline-start:auto" class="m_4081bf90 mantine-Group-root"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-calendar "><path d="M4 7a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12"></path><path d="M16 3v4"></path><path d="M8 3v4"></path><path d="M4 11h16"></path><path d="M11 15h1"></path><path d="M12 15v3"></path></svg><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root" data-inherit="true">3 месяца назад</p></div><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-user "><path d="M8 7a4 4 0 1 0 8 0a4 4 0 0 0 -8 0"></path><path d="M6 21v-2a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v2"></path></svg><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root" data-inherit="true">Nikolai Gagarinov</p></div></div><div role="link" tabindex="0" style="cursor:pointer"><button style="display:block;width:100%" class="mantine-focus-auto m_87cf2631 mantine-UnstyledButton-root" type="button" aria-label="Присоединяйтесь к нашему Telegram-сообществу"><div style="background-color:light-dark(var(--mantine-color-gray-1), var(--mantine-color-dark-6));margin-block:var(--mantine-spacing-xs)" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root"><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:flex-start;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root"><div style="--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;margin-inline-end:auto;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-brand-telegram "><path d="M15 10l-4 4l6 6l4 -16l-18 7l4 2l2 6l3 -4"></path></svg></div>Присоединяйтесь к нашему Telegram-сообществу</div></div></button></div><h2 style="--title-fw:var(--mantine-h2-font-weight);--title-lh:var(--mantine-h2-line-height);--title-fz:var(--mantine-h2-font-size);margin-block:var(--mantine-spacing-xl)" class="m_8a5d1357 mantine-Title-root" data-order="2">Ответы</h2><div style="margin-bottom:var(--mantine-spacing-xl);padding:var(--mantine-spacing-lg)" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true" id="answer-5152"><div style="--group-gap:calc(1.125rem * var(--mantine-scale));--group-align:stretch;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><div style="--stack-gap:var(--mantine-spacing-md);--stack-align:stretch;--stack-justify:flex-start;font-size:var(--mantine-font-size-h1);font-weight:lighter;text-align:center" class="m_6d731127 mantine-Stack-root">1<a style="color:inherit" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/qna/glossary/questions/chto-takoe-csv/answers/5152/vote"><div style="--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-thumb-up "><path d="M7 11v8a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1v-7a1 1 0 0 1 1 -1h3a4 4 0 0 0 4 -4v-1a2 2 0 0 1 4 0v5h3a2 2 0 0 1 2 2l-1 5a2 3 0 0 1 -2 2h-7a3 3 0 0 1 -3 -3"></path></svg></div></a><div style="--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-check "><path d="M5 12l5 5l10 -10"></path></svg></div></div><div style="--stack-gap:var(--mantine-spacing-md);--stack-align:stretch;--stack-justify:flex-start;width:100%;min-width:0rem" class="m_6d731127 mantine-Stack-root"><div style="margin-bottom:auto" class="m_d08caa0 mantine-Typography-root"><p>CSV (Comma-Separated Values) — это минималистичный текстовый формат, созданный для хранения и передачи табличных данных между разными системами. Каждая строка в таком файле представляет собой отдельную запись, а значения внутри неё разделяются символами — чаще запятой, но нередко и точкой с запятой, табуляцией или другим разделителем. Этот формат не нуждается в сложной структуре: данные можно прочитать в обычном текстовом редакторе, а программы — импортировать их без дополнительных настроек.</p>
<p><img style="--image-object-fit:contain;width:auto" class="m_9e117634 mantine-Image-root" src="https://cdn6.hexlet.io/OTzukqCnSpBE.png" alt="csv image example" loading="lazy"/></p>
<p>CSV применяют, когда нужно быстро и без потерь обменяться таблицей между системами. Например, экспортировать отчёт из бухгалтерии в Excel, перенести список клиентов из CRM в Google Sheets или выгрузить данные из базы в аналитическую платформу. Формат универсален: он не зависит от программного окружения и поддерживается практически везде, где можно открыть текстовый файл.</p>
<p>История CSV восходит к первым электронным таблицам и базам данных конца 1970-х. Тогда, на фоне несовместимости программ, формат стал простейшим способом обмена структурированными данными. За десятилетия он не утратил актуальности: несмотря на появление JSON, XML и XLSX, CSV остаётся рабочим стандартом для переноса таблиц — лёгким, прозрачным и свободным от привязки к конкретным системам.</p>
<h2 id="heading-2-1">Спецификация и стандарты</h2>
<p>Хотя CSV считается простым форматом, у него есть формальное описание — <strong>RFC 4180</strong>, опубликованное в 2005 году. Этот документ не делает формат жёстко стандартизированным, но описывает основные принципы, которые помогают программам корректно обмениваться данными.</p>
<h3 id="heading-3-2">RFC 4180: ключевые положения</h3>
<ul>
<li>Каждая строка файла — отдельная запись (обычно соответствует строке таблицы).</li>
<li>Поля внутри строки разделяются запятой, однако допускается использование других символов, например точки с запятой или табуляции.</li>
<li>Текстовые значения можно заключать в кавычки "...", особенно если внутри встречаются запятые, кавычки или переводы строк.</li>
<li>Кавычки внутри значения должны дублироваться: <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">"Company ""ABC"" Ltd"</code>.</li>
<li>Перенос строк — <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">CRLF</code> (Windows) или <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">LF</code> (Unix), в зависимости от системы.</li>
</ul>
<h3 id="heading-3-3">Когда стандарт обязателен, а когда есть допущения</h3>
<p>RFC 4180 носит рекомендательный характер. Программы и сервисы могут использовать собственные разделители, кодировки или способы экранирования. Например, Excel в русской локализации применяет точку с запятой вместо запятой, чтобы избежать конфликта с десятичным разделителем.</p>
<h3 id="heading-3-4">Несовместимости и расхождения</h3>
<p>Именно из-за отсутствия строгого единого стандарта CSV-файлы могут вести себя по-разному:</p>
<ul>
<li>различаются разделители (<code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">;</code>, <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">,</code>, <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">\t</code>);</li>
<li>встречаются разные кодировки (UTF-8, Windows-1251);</li>
<li>некоторые программы добавляют лишние кавычки или пропускают их вовсе.</li>
</ul>
<p>Эти мелкие отличия нередко вызывают ошибки при импорте или экспорте данных, особенно между системами, созданными в разных странах или на разных языках. Поэтому перед использованием CSV важно проверять настройки разделителя и кодировку.</p>
<h2 id="heading-2-5">Синтаксис CSV: базовые правила</h2>
<p>Формат CSV выглядит просто, но имеет ряд правил, которые обеспечивают корректное чтение и запись данных. Нарушение этих правил может привести к смещению столбцов, потере информации или ошибкам импорта.</p>
<h3 id="heading-3-6">Строки и поля, разделители</h3>
<p>Каждая строка файла соответствует одной записи таблицы. Поля внутри строки разделяются запятой, но в зависимости от локализации или программы могут использоваться и другие символы — точка с запятой, табуляция или вертикальная черта. Пример:</p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">Имя,Возраст,Город
Анна,29,Москва
Иван,34,Самара</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<h3 id="heading-3-7">Кавычки и экранирование</h3>
<p>Если значение содержит запятую, кавычку или перенос строки, его заключают в двойные кавычки:</p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">"Анна, менеджер",29,Москва</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<p>Кавычки внутри значения удваиваются, чтобы программа не восприняла их как границы поля:</p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">"Компания ""Ромашка""",2024,Санкт-Петербург</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<h3 id="heading-3-8">Обработка разделителя внутри поля</h3>
<p>Разделитель, заключённый в кавычки, не считается границей поля. Это позволяет хранить значения, где запятая является частью текста.</p>
<h3 id="heading-3-9">Пустые поля</h3>
<p>Если значение отсутствует, поле оставляют пустым между разделителями:</p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">Анна,29,
Иван,,Самара</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<p>В первом случае пустое поле в конце строки, во втором — в середине.</p>
<h3 id="heading-3-10">Перенос строки внутри полей</h3>
<p>Если в тексте встречается разрыв строки, он сохраняется, если значение заключено в кавычки:</p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">"Комментарий:
вторая строка",123</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<h3 id="heading-3-11">Варианты конца строки</h3>
<p>CSV поддерживает разные обозначения конца строки:</p>
<ul>
<li><strong>CR</strong> (<code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">\r</code>) — используется в старых системах macOS;</li>
<li><strong>LF</strong> (<code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">\n</code>) — стандарт для Unix и Linux;</li>
<li><strong>CRLF</strong> (<code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">\r\n</code>) — используется в Windows.</li>
</ul>
<h3 id="heading-3-12">Ограничения</h3>
<p>Все строки в файле должны содержать одинаковое количество полей. Если где-то их больше или меньше, программа при импорте может «сдвинуть» столбцы и нарушить структуру таблицы.</p>
<h2 id="heading-2-13">Кодировки и символы</h2>
<p>Работа с CSV-файлами напрямую зависит от выбранной кодировки — способа, которым символы представляются в виде байтов. Если кодировка не совпадает между программами, текст может отображаться с ошибками: вместо букв появятся «кракозябры» или вопросительные знаки.</p>
<p><img style="--image-object-fit:contain;width:auto" class="m_9e117634 mantine-Image-root" src="https://cdn6.hexlet.io/lvrmREcltmWd.png" alt="csv illustration" loading="lazy"/></p>
<h3 id="heading-3-14">Unicode, UTF-8, UTF-16, ANSI и другие</h3>
<p>Наиболее распространённая кодировка для CSV сегодня — <strong>UTF-8</strong>, поскольку она поддерживает все языки и символы. Встречаются также <strong>UTF-16</strong> (в Windows) и <strong>ANSI</strong> (старая система, зависящая от локали).</p>
<ul>
<li><strong>UTF-8</strong> — универсальная кодировка, совместима с большинством систем и редакторов.</li>
<li><strong>UTF-16</strong> — часто используется в Microsoft Excel, но может вызывать несовместимость при открытии файла в других программах.</li>
<li><strong>ANSI</strong> — ограничена национальными наборами символов (например, Windows-1251 для кириллицы).</li>
</ul>
<p>При работе с файлами из разных систем важно уточнять, в какой кодировке они сохранены, и при необходимости перекодировать их в UTF-8.</p>
<h3 id="heading-3-15">BOM (Byte Order Mark)</h3>
<p>Некоторые CSV-файлы, особенно созданные в Excel, содержат в начале невидимый символ BOM — <strong>Byte Order Mark</strong>. Он помогает программам определить, что файл записан в формате UTF-8 или UTF-16. Однако не все приложения обрабатывают BOM корректно. Например, при чтении файла в Python или других языках программирования BOM может восприниматься как часть первого поля.</p>
<h3 id="heading-3-16">Национальные и специальные символы</h3>
<p>CSV часто используется для хранения текстов на разных языках, поэтому важно, чтобы кодировка поддерживала национальные алфавиты — кириллицу, диакритические знаки, иероглифы. Кроме того, в таблицах нередко встречаются специальные символы вроде кавычек, запятых, знаков «;» или «|» — их нужно правильно экранировать с помощью кавычек, чтобы избежать ошибок при импорте.</p>
<h3 id="heading-3-17">Проблемы и решения</h3>
<ul>
<li><strong>Проблема:</strong> при открытии файла в Excel вместо кириллицы отображаются вопросительные знаки.
<strong>Решение:</strong> сохранить файл в UTF-8 без BOM или выбрать нужную кодировку при открытии.</li>
<li><strong>Проблема:</strong> в первой ячейке появляется странный символ «ï» или «?» — это следствие некорректного чтения BOM.
<strong>Решение:</strong> удалить BOM вручную или открыть файл с указанием параметра encoding='utf-8-sig'.</li>
</ul>
<p>Соблюдение единого стандарта кодировки (обычно UTF-8 без BOM) помогает избежать большинства проблем при работе с CSV-файлами на разных платформах.</p>
<h2 id="heading-2-18">Работа с CSV в языках и инструментах</h2>
<p>CSV-файлы поддерживаются практически во всех языках программирования и офисных приложениях. Это делает формат универсальным для интеграций, анализа данных и автоматизации процессов.</p>
<h3 id="heading-3-19">Python</h3>
<p>В Python работа с CSV возможна двумя основными способами:</p>
<p><strong>Модуль csv</strong> — стандартная библиотека, позволяющая построчно читать и записывать данные:</p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">import csv
with open('data.csv', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
print(row)</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<p>*<strong>Pandas</strong> — библиотека для анализа данных, которая автоматически определяет разделители и кодировки: </p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">import pandas as pd
df = pd.read_csv('data.csv')
print(df.head())</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<h3 id="heading-3-20">Java</h3>
<p>Для Java существует несколько популярных библиотек:</p>
<ul>
<li><strong>OpenCSV</strong> — простой инструмент для чтения и записи CSV-файлов:</li>
</ul>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">CSVReader reader = new CSVReader(new FileReader("data.csv"));
List<String[]> rows = reader.readAll();</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<ul>
<li><strong>Apache Commons CSV</strong> — более гибкая библиотека, поддерживающая разные кодировки и форматирование.</li>
</ul>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;
import java.io.FileReader;
import java.nio.charset.StandardCharsets;
public class CsvReadExample {
public static void main(String[] args) throws Exception {
try (CSVParser parser = CSVParser.parse(
new FileReader("data.csv", StandardCharsets.UTF_8),
CSVFormat.DEFAULT.withFirstRecordAsHeader()
)) {
for (CSVRecord record : parser) {
String name = record.get("name");
String age = record.get("age");
System.out.println(name + " — " + age);
}
}
}
}</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<h3 id="heading-3-21">C# / .NET</h3>
<p>В экосистеме .NET CSV можно обработать с помощью <strong>TextFieldParser</strong> из Microsoft.VisualBasic.FileIO или библиотек вроде <strong>CsvHelper</strong>:</p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">using (var reader = new StreamReader("data.csv"))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
var records = csv.GetRecords<MyClass>().ToList();
}</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<h3 id="heading-3-22">JavaScript / Node.js</h3>
<p>На стороне браузера CSV можно читать через FileReader, а в Node.js — использовать библиотеки <strong>csv-parser</strong> или <strong>Papaparse</strong>:</p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">import csv from 'csv-parser'
import fs from 'fs'
fs.createReadStream('data.csv')
.pipe(csv())
.on('data', (row) => console.log(row))</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<h3 id="heading-3-23">Excel, LibreOffice, Google Sheets</h3>
<p>Офисные программы автоматически открывают CSV-файлы и позволяют выбирать разделитель и кодировку. Excel нередко добавляет BOM и точку с запятой вместо запятой в русской локали, поэтому при экспорте в другие системы стоит проверять настройки. Google Sheets корректно обрабатывает UTF-8 и умеет экспортировать данные обратно в CSV.</p>
<h3 id="heading-3-24">SQL и СУБД</h3>
<p>CSV часто используется для импорта и экспорта данных между базами.</p>
<ul>
<li>В <strong>MySQL</strong> — команда:</li>
</ul>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">LOAD DATA INFILE 'data.csv'
INTO TABLE clients
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
IGNORE 1 ROWS;</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<p>В <strong>PostgreSQL</strong> — аналогичная команда:</p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">COPY clients FROM 'data.csv' DELIMITER ',' CSV HEADER;</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<p>Формат удобен тем, что его можно легко преобразовать в таблицу без дополнительных инструментов и сложных зависимостей.</p>
<h2 id="heading-2-25">Обработка больших CSV / масштабируемость</h2>
<h3 id="heading-3-26">Потоковая (ленивая) обработка</h3>
<p>Крупные CSV удобнее читать потоково: данные поступают построчно, без загрузки всего файла в память. В Python это csv.reader по открытому файловому объекту; в Node.js — стримы; в Java — BufferedReader или итераторы библиотек (OpenCSV, Commons CSV). Такой подход стабилен на файлах десятков гигабайт и позволяет сразу обрабатывать/писать результат.</p>
<p><img style="--image-object-fit:contain;width:auto" class="m_9e117634 mantine-Image-root" src="https://cdn6.hexlet.io/xkdDHSEPaNC4.png" alt="image" loading="lazy"/></p>
<h3 id="heading-3-27">Чтение по частям (чанки)</h3>
<p>Когда нужна табличная обработка, используют пакетную загрузку фиксированными порциями. В Pandas — read_csv(..., chunksize=100_000), в PostgreSQL — COPY в промежуточную таблицу по частям, в Spark/Dask — распределённые партиции. Чанки дают контроль над памятью и позволяют распараллеливать этапы (очистка, агрегации, запись).</p>
<h3 id="heading-3-28">Ограничения памяти</h3>
<p>Ключевые риски — попытка «распухнуть» датафрейм в RAM, дублирование структур, дорогое приведение типов. Практики: жёстко задавать типы столбцов при чтении, отключать авто-инференс, преобразовывать строки в категориальные, использовать генераторы/итераторы, временные файлы и поэтапную агрегацию (map → reduce).</p>
<h3 id="heading-3-29">Компрессия, архивирование, разделение на части</h3>
<p>Сжатие уменьшает I/O и место на диске: gzip/bzip2/zstd читаются потоково большинством инструментов (Pandas compression='gzip', zstd; zcat | …). Для параллельной загрузки лучше хранить набором файлов (sharding: data_0001.csv.gz, data_0002.csv.gz) или партициями по дате/ключу. При экспорте фиксируйте одинаковую схему столбцов и одинаковый разделитель/кодировку во всех частях — это упростит последующую сборку и импорт.</p>
<h2 id="heading-2-30">Ошибки, исключения и безопасность</h2>
<p>Работа с CSV кажется простой, но даже в таком формате часто возникают ошибки, особенно при импорте и интеграции данных из разных систем.</p>
<h3 id="heading-3-31">Неправильное количество полей</h3>
<p>Если строки содержат разное число столбцов, программа может «сдвинуть» данные — значения окажутся не в тех колонках. Причина чаще всего в лишних разделителях или пропущенных кавычках. Проверять равномерность структуры стоит перед импортом с помощью валидации или предварительного просмотра.</p>
<h3 id="heading-3-32">Непарные кавычки</h3>
<p>Классическая ошибка — когда поле открывается кавычкой, но не закрывается. В результате оставшаяся часть файла может восприниматься как одно длинное поле. Исправляется построчной проверкой или использованием специализированных парсеров, которые умеют восстанавливать структуру.</p>
<h3 id="heading-3-33">CSV-инъекции</h3>
<p>Опасная, но часто игнорируемая уязвимость. Если CSV открывается в Excel или Google Sheets, строка, начинающаяся с =, +, - или @, может интерпретироваться как формула. Это даёт злоумышленнику возможность внедрить вредоносные выражения вроде =HYPERLINK("<a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="http://phishing-site.com" rel="noopener noreferrer" target="_blank">http://phishing-site.com</a>").</p>
<p>Чтобы избежать таких атак, все значения, начинающиеся с этих символов, следует экранировать или преобразовывать в текст — например, добавлять апостроф перед ними.</p>
<h3 id="heading-3-34">Неподходящие разделители</h3>
<p>Использование запятой, точки с запятой или табуляции без согласования может привести к ошибкам при открытии файла в другой программе. Важно заранее определить символ-разделитель и явно указать его при экспорте и импорте.</p>
<h3 id="heading-3-35">Ошибки кодировок</h3>
<p>Самая частая причина искажённых символов. Разные системы используют разные кодировки — UTF-8, UTF-16, Windows-1251. При несовпадении отображаются «кракозябры». Оптимальный способ — всегда сохранять файлы в UTF-8 без BOM и при открытии явно указывать кодировку.</p>
<h2 id="heading-2-36">Сравнение CSV с альтернативами</h2>
<p>Формат CSV прост и универсален, но у него есть конкуренты, лучше подходящие для определённых задач.</p>
<h3 id="heading-3-37">JSON</h3>
<p>JSON хранит данные в виде пар «ключ–значение» и поддерживает вложенные структуры. Он удобен для передачи сложных объектов между веб-сервисами и приложениями. Однако для табличных данных JSON менее компактен и требует больше ресурсов при чтении.</p>
<h3 id="heading-3-38">XML</h3>
<p>XML использует теги и иерархическую структуру, что делает его гибким, но громоздким. Он подходит для систем, где важна валидация схемы и строгое описание данных. CSV выигрывает у XML в простоте и размере файлов.</p>
<h3 id="heading-3-39">Parquet, Avro, Feather</h3>
<p>Эти форматы применяются в аналитике и обработке больших данных. Они поддерживают сжатие, типизацию и эффективное чтение по столбцам. Parquet и Avro используют в Apache Spark, Hadoop, Snowflake. Однако для простого обмена таблицами они избыточны — CSV остаётся удобнее и понятнее.</p>
<h2 id="heading-2-40">Библиотеки, утилиты и инструменты</h2>
<p><strong>CLI-утилиты.</strong></p>
<ul>
<li>csvkit — набор инструментов для анализа CSV в терминале: фильтрация, сортировка, конвертация.</li>
<li>csvtool, mlr (Miller) — лёгкие утилиты для построчной обработки больших файлов.</li>
</ul>
<p><strong>Графические редакторы.</strong></p>
<ul>
<li><strong>Modern CSV</strong>, <strong>CSVed</strong>, **Ron’s Editor **— позволяют редактировать таблицы без потери форматирования.</li>
<li>Веб-варианты — <strong>ExtendsClass</strong>, <strong>CSV Viewer Online</strong>, где можно открыть и править файл прямо в браузере.</li>
</ul>
<p><strong>Конверторы и онлайн-сервисы.</strong></p>
<ul>
<li>Онлайн-инструменты для преобразования CSV в JSON, XML, Excel и обратно.</li>
<li>Утилиты Python (pandas.to_csv(), read_csv()) и Node.js (csvtojson) выполняют конвертацию программно.</li>
</ul>
<h2 id="heading-2-41">Рекомендации и лучшие практики</h2>
<ul>
<li>Использовать <strong>единообразный разделитель</strong> (; или ,) и согласовать его с системой-получателем.</li>
<li>Всегда явно указывать <strong>кодировку UTF-8 без BOM</strong>.</li>
<li>Экранировать <strong>кавычки и специальные символы</strong> внутри текстовых полей.</li>
<li>Добавлять <strong>строку заголовков</strong> с понятными именами столбцов.</li>
<li>Перед импортом выполнять <strong>валидацию</strong>: проверять количество полей, кодировку и наличие непарных кавычек.</li>
</ul>
<h2 id="heading-2-42">Заключение</h2>
<p>CSV остаётся самым доступным и гибким способом обмена табличными данными. Он не требует специализированных библиотек, читается в любом редакторе и легко интегрируется с системами.</p>
<p>Однако у формата есть ограничения: отсутствие типизации, риск ошибок при кодировках и низкая надёжность при работе с большими объёмами данных.</p>
<p>Современные тенденции показывают, что CSV постепенно уступает место более структурированным форматам вроде Parquet и Avro, но сохраняет свою актуальность как лёгкий и понятный инструмент для быстрой передачи информации между приложениями.</p></div><div class="m_3eebeb36 mantine-Divider-root" data-orientation="horizontal" role="separator"></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:flex-start;--group-wrap:wrap;font-size:var(--mantine-font-size-sm)" class="m_4081bf90 mantine-Group-root"><div style="--group-gap:var(--mantine-spacing-xs);--group-align:center;--group-justify:flex-start;--group-wrap:wrap;margin-inline-start:auto" class="m_4081bf90 mantine-Group-root"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-calendar "><path d="M4 7a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12"></path><path d="M16 3v4"></path><path d="M8 3v4"></path><path d="M4 11h16"></path><path d="M11 15h1"></path><path d="M12 15v3"></path></svg><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root" data-inherit="true">3 месяца назад</p></div><div style="--group-gap:var(--mantine-spacing-xs);--group-align:center;--group-justify:flex-start;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-user "><path d="M8 7a4 4 0 1 0 8 0a4 4 0 0 0 -8 0"></path><path d="M6 21v-2a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v2"></path></svg><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root" data-inherit="true">Nikolai Gagarinov</p></div></div></div></div></div></div><style data-mantine-styles="inline">.__m__-_R_5diub_{--col-flex-grow:auto;--col-flex-basis:100%;--col-max-width:100%;}@media(min-width: 48em){.__m__-_R_5diub_{--col-flex-grow:auto;--col-flex-basis:16.666666666666668%;--col-max-width:16.666666666666668%;}}@media(min-width: 62em){.__m__-_R_5diub_{--col-flex-grow:auto;--col-flex-basis:33.333333333333336%;--col-max-width:33.333333333333336%;}}</style><div class="m_96bdd299 mantine-Grid-col __m__-_R_5diub_ mantine-visible-from-md"><div style="margin-bottom:var(--mantine-spacing-xl);padding:var(--mantine-spacing-xl);background:var(--mantine-color-blue-0);width:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root"><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h4)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Похожие вопросы</p><ul class="m_abbac491 mantine-List-root"><li style="margin-bottom:var(--mantine-spacing-xs)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><a class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/qna/glossary/questions/naturalnye-chisla">Натуральные числа</a></span></div></li><li style="margin-bottom:var(--mantine-spacing-xs)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><a class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/qna/glossary/questions/correlation">Корреляция</a></span></div></li><li style="margin-bottom:var(--mantine-spacing-xs)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><a class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/qna/glossary/questions/screenshot">Скриншот</a></span></div></li><li style="margin-bottom:var(--mantine-spacing-xs)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><a class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/qna/glossary/questions/yandeks-metrika">Яндекс.Метрика</a></span></div></li><li style="margin-bottom:var(--mantine-spacing-xs)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><a class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/qna/glossary/questions/chto-takoe-upravlyayuschie-simvoly">Управляющие символы</a></span></div></li></ul></div></div></div></div></div></div>
</main>
<footer class="bg-dark fw-light text-light px-3 py-5">
<div class="row small">
<div class="col-12 col-sm-6 col-md-3">
<div class="h5 mb-3">Хекслет</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/about">О нас</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/testimonials">Отзывы</a>
</li>
<li>
<span class="nav-link link-light py-1 ps-0 external-link" data-href="https://b2b.hexlet.io" role="button">Корпоративное обучение</span>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/blog">Блог</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/qna">Вопросы и ответы</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/glossary">Глоссарий</a>
</li>
<li>
<span class="nav-link link-light py-1 ps-0 external-link" data-href="https://help.hexlet.io" data-target="_blank" role="button">Справка</span>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" target="_blank" rel="noopener noreferrer" href="/map">Карта сайта</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5 fw-normal mb-3">Направления</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_devops">DevOps
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_data_analytics">Аналитика
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_backend_development">Бэкенд
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_programming">Программирование
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_testing">Тестирование
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_front_end_dev">Фронтенд
</a></li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5">Профессии</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/devops-engineer-from-scratch">DevOps-инженер с нуля</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/go">Go-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/java">Java-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/python">Python-разработчик </a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/data-analytics">Аналитик данных</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/qa-engineer">Инженер по ручному тестированию</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/php">РНР-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/frontend">Фронтенд-разработчик</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5">Навыки</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/python-django-developer">Django</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/docker">Docker</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/php-laravel-developer">Laravel</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/postman">Postman</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/js-react-developer">React</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/js-rest-api">REST API в Node.js</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/spring-boot">Spring Boot</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/typescript">Typescript</a>
</li>
</ul>
</div>
</div>
<hr>
<div class="row">
<div class="col-12 col-sm-4 col-md-2">
<div class="fs-4">
<ul class="list-unstyled d-flex">
<li class="me-3">
<a aria-label="Telegram" target="_blank" class="link-light" rel="noopener noreferrer nofollow" href="https://t.me/hexlet_ru"><span class="bi bi-telegram"></span>
</a></li>
<li>
<a aria-label="Youtube" target="_blank" class="link-light" rel="noopener noreferrer nofollow" href="https://www.youtube.com/user/HexletUniversity"><span class="bi bi-youtube"></span>
</a></li>
</ul>
</div>
<div class="mb-2 d-flex flex-column">
<a class="link-light text-decoration-none" rel="nofollow" href="mailto:support@hexlet.io">support@hexlet.io</a>
<a class="link-light text-decoration-none py-2" target="_blank" href="https://t.me/hexlet_help_bot">t.me/hexlet_help_bot</a>
</div>
<ul class="list-unstyled d-flex">
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 external-link" rel="nofollow" data-href="https://hexlet.io/locale/switch?new_locale=en" data-target="_self" role="button"><span class="my-auto">EN</span>
</span></li>
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 opacity-100 external-link" rel="nofollow" data-href="https://ru.hexlet.io/locale/switch?new_locale=ru" data-target="_self" role="button"><span class="my-auto">RU</span>
</span></li>
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 external-link" rel="nofollow" data-href="https://kz.hexlet.io/locale/switch?new_locale=kz" data-target="_self" role="button"><span class="my-auto">KZ</span>
</span></li>
</ul>
</div>
<div class="col-12 col-sm-4 col-md-3">
<ul class="list-unstyled fs-4">
<li class="mb-3">
<a class="link-light text-decoration-none" href="tel:8%20800%20100%2022%2047">8 800 100 22 47</a>
<span class="d-block opacity-50 small">бесплатно по РФ</span>
</li>
<li>
<a class="link-light text-decoration-none" href="tel:%2B7%20495%20085%2021%2062">+7 495 085 21 62</a>
<span class="d-block opacity-50 small">бесплатно по Москве</span>
</li>
</ul>
</div>
<div class="col-12 col-sm-4 col-md-3">
<div class="small mb-3">Образовательные услуги оказываются на основании Л035-01298-77/01989008 от 14.03.2025</div>
<ul class="list-unstyled small">
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/legal">Правовая информация</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/offer">Оферта</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/license">Лицензия</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/contacts">Контакты</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-12 col-md-4 small">
<div class="mb-2">
<div>ООО «<a href="/" class="text-decoration-none link-light">Хекслет Рус</a>»</div>
<div>108813 г. Москва, вн.тер.г. поселение Московский,</div>
<div>г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3</div>
<div>ОГРН 1217300010476</div>
<div>ИНН 7325174845</div>
</div>
<hr>
<div>АНО ДПО «<a href="/" class="text-decoration-none link-light">Учебный центр «Хекслет</a>»</div>
<div>119331 г. Москва, вн. тер. г. муниципальный округ</div>
<div>Ломоносовский, пр-кт Вернадского, д. 29</div>
<div>ОГРН 1247700712390</div>
<div>ИНН 7736364948</div>
</div>
</div>
</footer>
<div id="root-assistant-offcanvas"></div>
<script src="/vite/assets/assistant-Bukl1lYy.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/init-BrRXra1y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ErrorFallbackBlock-naDSYSy9.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/MarkdownBlock-DbyKWoR_.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/gon-D3e4yh1x.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/mantine-CGMYrt2Y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/shiki-V011pkdv.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/utils-DRqSHbQE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/lib-XR8Qr8kR.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dist-GCHh59xr.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Box-B5-OOzBf.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/notifications.store-C-3AFSMn.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useIsomorphicEffect-HJ6VK0D3.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/lib-KSp6QbZ0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/axios-BEvgo0ym.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/classnames-l6ipYlLR.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dayjs.min-BkKovM-s.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/debounce-jMQ_Cf4f.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/i18next-BlSq9s7B.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/client-U9M77rxp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-dom-DaLxUz_h.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useTranslation-Bx1Cdrkz.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/compiler-runtime-6XxiPFnt.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/jsx-runtime-CwjcCKJi.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-CkL4ZRHB.js" as="script" crossorigin="anonymous">
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v67327c56f0bb4ef8b305cae61679db8f1769101564043" integrity="sha512-rdcWY47ByXd76cbCFzznIcEaCN71jqkWBBqlwhF1SY7KubdLKZiEGeP7AyieKZlGP9hbY/MhGrwXzJC/HulNyg==" data-cf-beacon='{"version":"2024.11.0","token":"d11015b65d11429ea6b4a2ef37dd7e0b","server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
</body>
</html>