CSV Writing Intro

Here we cover the basics of writing CSV files in C#. This is also useful when you only read CSV files from 3rd parties. For example, for unit testing.

To write a CSV file using CSVHelper in C#, we first need to define the CSV field mappings in a class file in C#. We will reuse the definition from the CSV Parsing Intro. See this article for details.

Next, we can define a function to write to a CSV file using CsvWriter:

public async Task WriteCsvFile(IEnumerable<CsvRecord> records, FileInfo fileInfo) {
    Logger.LogInformation($"Writing file to {fileInfo.FullName}");
    await using var writer = new StreamWriter(fileInfo.FullName);
    await using var csv = new CsvWriter(writer, CultureInfo.InvariantCulture);
    csv.WriteHeader<CsvRecord>();
    // make a new line
    await csv.NextRecordAsync();
    await csv.WriteRecordsAsync(records);
}

We have covered CsvConfiguration options for reading, where they are most useful. For writing, some options that might be useful are

  • IncludePrivateMembers — boolean to define whether private members of the class should be written to csv.

Unfortunately, I found that datetime format annotations do not have an effect when writing CSV file. To write Dates/DateTimes in a desired format, you can apply special converter options before writing the file:

var options = new TypeConverterOptions { Formats = new [] { "MM/dd/yyyy" } };
csv.Context.TypeConverterOptionsCache.AddOptions<DateTime>(options);