Гид по технологиям

Сохранение данных в CSV из C# — пошаговое руководство

4 min read Разработка Обновлено 13 Dec 2025
C# — как сохранить данные в CSV: пошагово
C# — как сохранить данные в CSV: пошагово

Краткое определение: CSV (Comma-Separated Values) — текстовый формат, где значения столбцов разделяются запятыми; строки соответствуют записям.

CSV файл с данными

Зачем использовать CSV

CSV — простой и переносимый формат для экспорта табличных данных. Его удобно открывать в Excel, парсить в скриптах и передавать между системами. CSV не подходит для сложных схем, вложенных структур или метаданных — для этого лучше использовать JSON, XML или форматы Excel.

Важно: CSV хранит только данные; типы (даты, числа) при открытии в Excel интерпретируются на основе региональных настроек.

Что нужно подготовить

  • Visual Studio или любой редактор для .NET.
  • .NET 6+ или .NET Framework (примеры универсальны, но синтаксис может немного отличаться).
  • Папка для вывода файла (путь в примерах — Windows). На Linux/macOS используйте пути в формате POSIX.

Структура примера

Мы используем класс Student, массив студентов, формируем строку заголовков, затем для каждой записи добавляем строку с разделителем “,” и записываем результат в файл.

Определение класса Student

public class Student
{
    public int StudentId;
    public string FirstName;
    public string LastName;
    public string Dob; // для простоты строки, можно использовать DateTime

    public Student(int StudentId, string FirstName, string LastName, string Dob)
    {
        this.StudentId = StudentId;
        this.FirstName = FirstName;
        this.LastName = LastName;
        this.Dob = Dob;
    }
}

Пример массива студентов в Main()

static void Main(string[] args)
{
    // Создаем массив с тестовыми студентами
    Student[] students =
    {
        new Student(1, "John", "Smith", "03/04/1990"),
        new Student(2, "Adam", "Van Houten", "07/07/1991"),
        new Student(3, "Joey", "Richardson", "01/02/1992"),
        new Student(4, "Matt", "Adams", "05/05/1992"),
        new Student(5, "Jake", "Smith", "04/04/1994"),
    };
}

Создание CSV: базовый вариант

  1. Укажите путь к файлу. На Windows используйте @”C:\path\to\file.csv”.
String file = @"C:\Users\Sharl\Desktop\Output.csv";
  1. Создайте StringBuilder и разделитель.
String separator = ",";
StringBuilder output = new StringBuilder();
  1. Добавьте заголовки (первую строку).
String[] headings = { "StudentID", "First Name", "Last Name", "Date Of Birth" };
output.AppendLine(string.Join(separator, headings));
  1. Для каждой записи формируем строку и добавляем её в буфер.
foreach (Student student in students)
{
    String[] newLine = { student.StudentId.ToString(), student.FirstName, student.LastName, student.Dob };
    output.AppendLine(string.Join(separator, newLine));
}
  1. Записываем в файл с обработкой ошибок.
try
{
    File.AppendAllText(file, output.ToString());
}
catch(Exception ex)
{
    Console.WriteLine("Data could not be written to the CSV file.");
    return;
}

Console.WriteLine("The data has been successfully saved to the CSV file");

Примечание: File.AppendAllText добавляет в конец файла; если нужно перезаписать файл, используйте File.WriteAllText.

Частые ошибки и как их избегать

  • Значения содержат запятые: нужно экранировать поле кавычками и внутри экранировать кавычки двойными кавычками.
  • Кодировка: чтобы Excel корректно открывал кириллицу, используйте UTF-8 с BOM или кодировку Windows-1251 при необходимости.
  • Даты и числа: Excel использует локальные форматы; лучше хранить ISO-формат даты (YYYY-MM-DD) для переносимости.
  • Большие файлы: не собирайте весь файл в памяти (StringBuilder) — используйте StreamWriter и пишите построчно.

Экранирование значений (простой метод)

string EscapeCsv(string field)
{
    if (field == null) return "";
    bool mustQuote = field.Contains(",") || field.Contains("\"") || field.Contains("\n") || field.Contains("\r");
    string escaped = field.Replace("\"", "\"\"");
    return mustQuote ? "\"" + escaped + "\"" : escaped;
}

// В цикле:
String[] newLine = { student.StudentId.ToString(), EscapeCsv(student.FirstName), EscapeCsv(student.LastName), EscapeCsv(student.Dob) };
output.AppendLine(string.Join(separator, newLine));

Альтернативные подходы

  1. File.WriteAllLines — удобно для небольших наборов строк:
File.WriteAllLines(file, linesArray, Encoding.UTF8);
  1. StreamWriter — предпочтителен для больших файлов, позволяет задать буфер и кодировку:
using (var writer = new StreamWriter(file, false, new UTF8Encoding(true))) // true — BOM
{
    writer.WriteLine(string.Join(separator, headings));
    foreach(var s in students)
    {
        writer.WriteLine(string.Join(separator, new[]{ s.StudentId.ToString(), EscapeCsv(s.FirstName), EscapeCsv(s.LastName), EscapeCsv(s.Dob) }));
    }
}
  1. CsvHelper (библиотека NuGet) — удобна при сложных схемах, маппинге, профилировании и экспорте с указанием культур/форматов:
// Установка: Install-Package CsvHelper
using (var writer = new StreamWriter(file, false, new UTF8Encoding(true)))
using (var csv = new CsvHelper.CsvWriter(writer, CultureInfo.InvariantCulture))
{
    csv.WriteHeader();
    csv.NextRecord();
    foreach (var s in students)
    {
        csv.WriteRecord(s);
        csv.NextRecord();
    }
}

CsvHelper автоматически обрабатывает экранирование, форматы и культурные особенности.

Когда не использовать CSV — контрпримеры

  • Нужны вложенные структуры или массивы в полях — используйте JSON или BSON.
  • Требуется строгая типизация и формула в ячейках Excel — используйте настоящий .xlsx через библиотеку (EPPlus, OpenXML).
  • Передача конфиденциальных данных без шифрования — CSV хранится в открытом виде, требуется дополнительная защита.

Критерии приёмки

  • Файл создан в указанной директории.
  • Первая строка содержит корректные заголовки.
  • Для каждой записи создана строка с нужным числом столбцов.
  • Значения, содержащие запятую/кавычки/перенос строки, корректно экранированы.
  • Файл открывается в Excel и данные отображаются как ожидается (по крайней мере в целевой локали).

Чек‑лист перед выпуском

  • Кодировка файла согласована с потребителем данных (UTF‑8/BOM или другое).
  • Реализовано экранирование полей.
  • Обработаны ошибки записи (try/catch и логирование).
  • Для больших наборов данных используется стриминг, а не накопление в памяти.
  • Путь к файлу не хардкоден в продакшенном коде — используется конфигурация.

Пример вывода CSV (примерный)

StudentID,First Name,Last Name,Date Of Birth
1,John,Smith,03/04/1990
2,Adam,"Van Houten",07/07/1991
3,Joey,Richardson,01/02/1992

Проверки и тесты (минимально необходимые)

  • Unit-тест: экранирование значений с запятой и кавычками.
  • Интеграционный тест: создаётся файл и сравнивается с эталоном по строкам (независимо от порядка BOM).
  • Нагрузочный тест: запись большого количества записей не превышает допустимой памяти и времени.

Руководство по отладке (быстрый план действий)

  1. Запустите приложение в Visual Studio (зелёная кнопка Play).Запуск консольного приложения в Visual Studio
  2. Проверьте консоль на сообщение об успехе или ошибке.Сообщение об успешном выполнении в консоли
  3. Откройте созданный файл в папке вывода и проверьте содержимое в текстовом редакторе.CSV результат в Notepad++
  4. Откройте файл в Excel для визуальной проверки столбцов и форматов.CSV в Excel

Советы по совместимости и локализации

  • Разделитель: в некоторых локалях (например, если запятая используется как десятичный разделитель) при открытии в Excel может применяться точка с запятой. Для максимальной совместимости используйте явный разделитель или экспортер, поддерживающий указание разделителя.
  • Даты: сохраняйте в ISO-формате (YYYY-MM-DD) или используйте CsvHelper с конкретной CultureInfo.
  • Для Linux/macOS путь к файлу и права записи отличаются — убедитесь, что приложение имеет доступ к директории.

Резюме

  • CSV — простой и удобный формат для табличных данных; в C# можно писать вручную (StringBuilder, StreamWriter) или использовать специализированные библиотеки (CsvHelper) для корректной обработки краевых случаев.
  • Для небольших наборов допустимо накапливать строки в памяти; для больших — писать построчно.
  • Всегда экранируйте поля и проверяйте кодировку, если работаете с символами не из ASCII.

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


Если нужно, могу добавить готовый пример проекта Visual Studio (.cs файлы) с тестами и примером использования CsvHelper.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Включение Google Assistant: сделать Android похожим на Pixel
Android.

Включение Google Assistant: сделать Android похожим на Pixel

Dell SupportAssist OS Recovery — что это и как пользоваться
Руководство

Dell SupportAssist OS Recovery — что это и как пользоваться

Удаление файлов и папок через CMD в Windows 10
Windows 10

Удаление файлов и папок через CMD в Windows 10

PS4 Remote Play на Windows — настройка и советы
Гайды

PS4 Remote Play на Windows — настройка и советы

Тренировка подсознания с помощью сублиминалов
Саморазвитие

Тренировка подсознания с помощью сублиминалов

Routinery — приложение для привычек и самоухода
Приложения

Routinery — приложение для привычек и самоухода