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

Зачем использовать 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: базовый вариант
- Укажите путь к файлу. На Windows используйте @”C:\path\to\file.csv”.
String file = @"C:\Users\Sharl\Desktop\Output.csv";- Создайте StringBuilder и разделитель.
String separator = ",";
StringBuilder output = new StringBuilder();- Добавьте заголовки (первую строку).
String[] headings = { "StudentID", "First Name", "Last Name", "Date Of Birth" };
output.AppendLine(string.Join(separator, headings));- Для каждой записи формируем строку и добавляем её в буфер.
foreach (Student student in students)
{
String[] newLine = { student.StudentId.ToString(), student.FirstName, student.LastName, student.Dob };
output.AppendLine(string.Join(separator, newLine));
}- Записываем в файл с обработкой ошибок.
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));Альтернативные подходы
- File.WriteAllLines — удобно для небольших наборов строк:
File.WriteAllLines(file, linesArray, Encoding.UTF8);- 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) }));
}
}- 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).
- Нагрузочный тест: запись большого количества записей не превышает допустимой памяти и времени.
Руководство по отладке (быстрый план действий)
- Запустите приложение в Visual Studio (зелёная кнопка Play).
- Проверьте консоль на сообщение об успехе или ошибке.
- Откройте созданный файл в папке вывода и проверьте содержимое в текстовом редакторе.
- Откройте файл в Excel для визуальной проверки столбцов и форматов.
Советы по совместимости и локализации
- Разделитель: в некоторых локалях (например, если запятая используется как десятичный разделитель) при открытии в Excel может применяться точка с запятой. Для максимальной совместимости используйте явный разделитель или экспортер, поддерживающий указание разделителя.
- Даты: сохраняйте в ISO-формате (YYYY-MM-DD) или используйте CsvHelper с конкретной CultureInfo.
- Для Linux/macOS путь к файлу и права записи отличаются — убедитесь, что приложение имеет доступ к директории.
Резюме
- CSV — простой и удобный формат для табличных данных; в C# можно писать вручную (StringBuilder, StreamWriter) или использовать специализированные библиотеки (CsvHelper) для корректной обработки краевых случаев.
- Для небольших наборов допустимо накапливать строки в памяти; для больших — писать построчно.
- Всегда экранируйте поля и проверяйте кодировку, если работаете с символами не из ASCII.
Важно: не храните в открытом CSV чувствительные данные без шифрования или ограничений доступа.
Если нужно, могу добавить готовый пример проекта Visual Studio (.cs файлы) с тестами и примером использования CsvHelper.
Похожие материалы
Включение Google Assistant: сделать Android похожим на Pixel
Dell SupportAssist OS Recovery — что это и как пользоваться
Удаление файлов и папок через CMD в Windows 10
PS4 Remote Play на Windows — настройка и советы
Тренировка подсознания с помощью сублиминалов