Skip to content

jitbit/CsvExport

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

121 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CsvExport

A very simple and very fast CSV-export tool for C#.

.NET

V3 Breaking changes:

  • .NET 8 targeting (use v2 for .NET Framework, we'll backport critical fixes)
  • Uses char instead of string for column separator

Features

  1. 33 times faster than CsvHelper
  2. 3X less memory usage
  3. Streaming support (CSV writer does not buffer large CSVs in memory)
  4. Excel-compatible export (separator detected automatically, friendly-trimming rows and values for compatibility)
  5. Escapes commas, quotes, multiline text
  6. Exports dates in timezone-proof format
  7. Extremely easy to use
  8. 4-times less memory usage

Benchmarks

Method Mean Error StdDev Gen0 Gen1 Allocated
😟 CsvHelper 372.90 us 390.842 us 21.423 us 9.7656 4.8828 85.4 KB
✅ CsvExport_Manual 12.71 us 1.040 us 0.057 us 3.5858 0.1984 29.35 KB
✅ CsvExport_GenericType 13.22 us 1.240 us 0.068 us 3.5858 0.2289 29.39 KB

This benchmark is generating a 100-line CSV file with 4 columns. Check the "SpeedBenchmarks" code.

Usage examples:

Install via Nuget Install-Package CsvExport

For "manual" CSV ad-hoc generation use this:

var myExport = new CsvExport();

myExport.AddRow();
myExport["Region"] = "Los Angeles, USA";
myExport["Sales"] = 100000;
myExport["Date Opened"] = new DateTime(2003, 12, 31);

myExport.AddRow();
myExport["Region"] = "Canberra \"in\" Australia";
myExport["Sales"] = 50000;
myExport["Date Opened"] = new DateTime(2005, 1, 1, 9, 30, 0);

//save as file
myExport.ExportToFile("results.csv");

For generating CSV out of a typed List<T> of objects:

public class Foo
{
	public string Region { get; set; }
	public int Sales { get; set; }
	public DateTime DateOpened { get; set; }
}

var list = new List<Foo>
{
	new Foo { Region = "Los Angeles", Sales = 123321, DateOpened = DateTime.Now },
	new Foo { Region = "Canberra in Australia", Sales = 123321, DateOpened = DateTime.Now },
};

var myExport = new CsvExport();
myExport.AddRows(list);
string csv = myExport.Export();

Configuring is done via constructor parameters:

var myExport = new CsvExport(
	columnSeparator: ',',
	includeColumnSeparatorDefinitionPreamble: true, //Excel wants this in CSV files
	includeHeaderRow: true
);

Also, methods ExportToFile and WriteToStream and ExportToBytes offer an optional encoding parameter.

Using with ASP.NET Core:

For big CSV files (megabytes) use WriteToStreamAsync and write to Response.Body directly. This is very important to save memory usage. Here's a handy heper class:

public class CsvExportResult(Csv.CsvExport csv, string fileName) : ActionResult
{
	public override Task ExecuteResultAsync(ActionContext ctx)
	{
		var res = ctx.HttpContext.Response;
		res.ContentType = "text/csv";
		res.Headers.ContentDisposition = $"attachment; filename=\"{fileName}\"";
		return csv.WriteToStreamAsync(res.Body, cancellationToken: ctx.HttpContext.RequestAborted);
	}
}

//usage in MVC action
return new CsvExportResult(csvExport, "filename.csv");

License

The code is licensed under MIT License.

Sucessfully tested for years in production with our Jitbit Helpdesk Ticketing System

About

Very simple CSV-export tool for C#

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages