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

Сохранение данных в CSV-файл из C#

6 min read C++ Обновлено 05 Jan 2026
Сохранение данных в CSV из C#
Сохранение данных в CSV из C#

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

Сохранение данных в файл — простой и мощный способ для последующего анализа и отчётности. В C# распространён формат CSV (comma-separated values), который представляет собой текстовый файл, где значения разделяются запятой (или другим разделителем). Такой файл удобно открыть в Excel или в любом текстовом редакторе и просмотреть в виде строк и столбцов.

Что такое CSV и как он хранит данные

CSV — текстовый формат, где каждая строка соответствует одной записи (строке таблицы), а столбцы разделяются разделителем, чаще всего запятой. Если значения содержат запятые или перевод строки, их обычно берут в кавычки “” и экранируют внутренние кавычки.

Ключевые моменты:

  • Каждая запись — отдельная строка в файле.
  • Разделитель по умолчанию — запятая, но может быть точка с запятой или табуляция в зависимости от локали.
  • Кодировка важна: для корректного отображения кириллицы используйте UTF-8 (часто с BOM для совместимости с Excel).

Быстрый пример формата

StringBuilder output = new StringBuilder();  
output.AppendLine(string.Join(",", new String[] { "1", "2", "3" }));  
// CSV File Output = 1,2,3

Создание консольного приложения и тестовых данных в Visual Studio

  1. Откройте Visual Studio и нажмите Create a new project. Создание нового консольного приложения
  2. Выберите Console Application и нажмите Next. Выбор шаблона консольного приложения
  3. Задайте имя проекта и место хранения. Нажмите Next. Диалог создания проекта в Visual Studio
  4. Оставьте Target Framework по умолчанию и нажмите Create — Visual Studio сгенерирует шаблон консольного приложения.
  5. Вверху файла добавьте пространства имён для работы с файлами и строками (если их нет):
using System.IO;  
using System.Text;
  1. Добавим класс для тестовых данных — Student. Этот код оставляем без перевода, т.к. это рабочий C# код:
public class Student  
{  
    public int StudentId;  
    public string FirstName;  
    public string LastName;  
    public string Dob;  
   
    public Student(int StudentId, string FirstName, string LastName, string Dob)  
    {  
        this.StudentId = StudentId;  
        this.FirstName = FirstName;  
        this.LastName = LastName;  
        this.Dob = Dob;  
    }  
}
  1. В методе Main() замените шаблонный код на массив студентов:
static void Main(string[] args)  
{  
    // Create an array with a list of students  
    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"),  
    };     
}

Важно: форматы дат в тестовом массиве приведены в формате MM/dd/yyyy — это пример данных. В продакшне согласуйте формат даты (например, ISO yyyy-MM-dd) и локаль.

Создание CSV-файла и добавление заголовков

  1. Внутри Main(), под массивом students, задайте путь к создаваемому файлу. Если файл не существует, он будет создан автоматически:
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. Для каждой записи students создайте строку и добавьте её в StringBuilder:
foreach (Student student in students)  
{  
}
  1. Соберите поля и форматируйте строку:
String[] newLine = { student.StudentId.ToString(), student.FirstName, student.LastName, student.Dob };  
output.AppendLine(string.Join(separator, newLine));
  1. Альтернативно, можно использовать string.Format (необходима осторожность с разделителем и экранированием):
string newLine = string.Format("{0}, {1}, {2}, {3}", 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;  
}
  1. Сообщите пользователю об успешной записи:
Console.WriteLine("The data has been successfully saved to the CSV file");  

Примечание: File.AppendAllText добавляет данные в конец существующего файла. Для перезаписи используйте File.WriteAllText или StreamWriter с overwrite.

Как открыть и проверить CSV-файл

  1. Запустите программу (зелёная кнопка Run в Visual Studio). Запуск консольного приложения в Visual Studio
  2. После успешного выполнения перейдите в папку и откройте Output.csv в Excel для визуального просмотра в виде таблицы. CSV открыт в Excel
  3. Для проверки «сырых» данных откройте файл в текстовом редакторе, например Notepad++. CSV открыт в текстовом редакторе

Частые проблемы и как их решать

Важно:

  • Запятые внутри полей: если данные содержат запятые, берите поле в двойные кавычки и экранируйте внутренние кавычки.
  • Новые строки внутри полей: тоже требуют кавычек и корректного экранирования.
  • Кодировка: Excel на Windows ожидает часто UTF-8 с BOM или Windows-1251 для русских символов. Рекомендуем использовать UTF-8 с BOM для совместимости.
  • Разделитель в локали: в некоторых странах по умолчанию используется точка с запятой (;) вместо запятой — учитывайте это при экспорте.
  • Блокировка файла: если файл открыт в другой программе, запись может завершиться исключением — обрабатывайте IOException и ретрайте или уведомляйте пользователя.

Пример записи в файл с явной кодировкой и перезаписью:

using (var writer = new StreamWriter(file, false, new UTF8Encoding(true)))
{
    writer.Write(output.ToString());
}

Этот фрагмент создаст файл с BOM и перезапишет его (false во втором параметре означает overwrite).

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

  • Использовать библиотеку CsvHelper (пакет NuGet) — удобная и надёжная обёртка для сериализации объектов в CSV с поддержкой маппинга, кастомных разделителей и культур.
  • Формировать CSV потоково через CsvHelper или TextWriter для больших объёмов, чтобы не держать весь файл в памяти.
  • Экспорт в Excel напрямую (например, через OpenXML или EPPlus), если нужны стили и формулы.

Пример простого использования CsvHelper (упрощённо):

using (var writer = new StreamWriter(file, false, new UTF8Encoding(true)))
using (var csv = new CsvHelper.CsvWriter(writer, CultureInfo.InvariantCulture))
{
    csv.WriteRecords(students);
}

Когда CSV — не лучший выбор (контрпримеры)

  • Если данные содержат вложенные структуры (массивы, объекты) — лучше JSON или Parquet.
  • Для больших наборов данных, где важна колонночная компрессия и аналитика — Parquet/ORC.
  • Если нужна надёжность транзакций при записи — используйте базу данных.

Безопасность, права доступа и приватность

  • Ограничьте доступ к директории, где сохраняются CSV-файлы; не кладите конфиденциальные данные в публичные папки.
  • При экспорте персональных данных учитывайте требования GDPR/локального законодательства: минимизируйте поля и храните только необходимое.
  • Не логируйте чувствительные значения в открытые логи.
  • Для временных файлов используйте защищённые временные директории и удаляйте их по окончании работы.

Критерии приёмки (что проверить перед релизом)

  • Файл создаётся по указанному пути.
  • Заголовки присутствуют и в правильном порядке.
  • Все записи корректно экранированы (запятые, кавычки, переводы строк).
  • Кодировка UTF-8 позволяет корректно отобразить национальные символы в Excel и текстовых редакторах.
  • Поведение при ошибках: информативное сообщение и корректный возврат кода ошибки.

Чек-лист по ролям

Разработчик:

  • Использует StreamWriter или CsvHelper для больших данных.
  • Явно указывает кодировку.
  • Обрабатывает исключения IO.

Тестировщик:

  • Проверил данные с запятыми и кавычками.
  • Открыл файл в Excel, проверил разделители и кодировку.
  • Проверил поведение при отсутствии прав на запись.

Операции / DevOps:

  • Настроил ротацию/удаление старых экспортов.
  • Ограничил права доступа к папке экспорта.

Короткий метод (mini-methodology) — шаги для надёжного экспорта

  1. Решите формат данных и выбор разделителя (запятая/точка с запятой).
  2. Подготовьте модель (объект Student). Приводите даты к унифицированному формату (ISO).
  3. Используйте StreamWriter или CsvHelper, указывая UTF-8 BOM.
  4. Экранируйте поля с запятыми/кавычками.
  5. Тестируйте с разными локалями и открывайте в Excel.

1‑строчная глоссарий

  • CSV — текстовый формат, где записи разделяются строками, а поля внутри записи — указанным разделителем (обычно запятой).

Заключение

Сохранение данных в CSV из C# просто реализуется с помощью StringBuilder и File APIs, но надёжное решение требует учёта кодировки, экранирования и ограничений локали. Для продакшн-решений стоит использовать проверенные библиотеки вроде CsvHelper и предусмотреть безопасность и тестирование экспорта.

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

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

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

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство