NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
NuGet · #92 most downloaded on NuGet
A library for reading and writing CSV files. Extremely fast, flexible, and easy to use. Supports reading and writing of custom class objects.
Last release 1 years ago
02 Jun 2025
Ships unpredictably
gaps range from 8 days to 1.2 years
Nearly every release is documented
notes for 60 of the last 60 stable releases
10 versions withdrawn
withdrawn after publishing
127 years old
236 releases · first in 1900
Fixed breaking change to not break.
Fixed issue where header wasn't written when there were no records in the IEnumerable on WriteRecords( IEnumerable ).
Fixed issue where an exception was always thrown if Configuration.ThrowOnBadData is on.
One column per quarter.
Nothing published for this version
Nothing published for this version
Fixed issue with mappings overwriting an explicitly set index when re-indexing.
Fixed issue with mappings overwriting an explicitly set index when re-indexing.
Auto mapping will ignore Enumerable properties instead of throwing an exception. Exceptions will still be thrown if an Enumerable is used outside of auto mapping.
Nothing published for this version
PCL implementation. .NET 4.0+, Silveright 4.0+, WP7 7.5+, Windows 8
PCL implementation. .NET 4.0+, Silveright 4.0+, WP7 7.5+, Windows 8
Excel separator record reading and writing.
Writer speed enhancements. Thanks to thecontrarycat.
Nothing published for this version
Nothing published for this version
Fixed issue where parsing would add delimiter chars to the field when the buffer ran out in the middle of the delimiter.
Nothing published for this version
Nothing published for this version
Fixed issue with parser where a line wouldn't end if the previous char was a \0.
Fixed issue with trimming fields not working under one path. 2.2.0
Added Row property to ICsvReader.
Config option to trim headers and values when reading.
Nothing published for this version
Fixed issue when WillThrowOnMissingField is off and exception was still being thrown.
Made RegisterClassMap overload with CsvClassMap instance public.
Made a WinRT Any CPU build and removed the arch specific WinRT builds.
Added parser configuration to ignoring quotes and treating them like any other character.
Added parser configuration to ignoring quotes and treating them like any other character.
Added CsvFactory to create ICsvParser, ICsvReader, and ICsvWriter classes. This is useful when you need to unit test code that uses CsvHelper since these 3 classes require a TextReader or TextWriter to work.
All assembly versions are strong named but will use a single version of 2.0.0.0. The file version and NuGet versions will change with every release.
Removed class type constraint from reading and writing.
Added non-generic class mapping overload.
WriteRecords param changed from IEnumerable to non-generic IEnumerable.
Value types can be read and written instead of just custom classes.
Indexes are automatically set and incremented when mapping in order of the Map and Reference calls.
Auto mapping with circular reference detection.
Config option to ignore spaces in header names.
Fixed exception handling. Exception are no longer wrapped. Exception.Data["CsvHelper"] contains CsvHelper specific exception info.
Row exception can be skipped during GetRecords.
Renamed IsStrictMode to WillThrowOnMissingField.
Window Phone 7 & 8 builds.
Auto mapping will use defined maps if available.
Type converter options.
Added IEnumerable converter that throws an exception so people will know that converting to/from and enumerable is not supported instead of getting a cryptic error message.
Dynamic support for reading and writing.
Multiple maps can be supplied.
Renamed InvalidateRecordCache to ClearRecordCache.
Recursive reference mapping down the whole mapping tree.
Configuration.CultureInfo was added in place of Configuration.UseInvariantCulture.
Getting the exception helper message failed when writing because no parser is available.
WriteRecords Dynamic invoke had wrong parameter count.
GetField( string ) was not returning null if the header is not found.
CsvBadDataException when there were extra columns in the row.
Raw record corruption.
Nothing published for this version
Nothing published for this version
Ignore properties that can't be set in attribute mapping.
Ignore properties that can't be set in attribute mapping.
Made TypeConverterFactory thread safe.
Added remove converter method.
Change TypeConverterFactory to use a set of cache type converters so global type converters can be used.
Change TypeConverterFactory to use a set of cache type converters so global type converters can be used.
Added GetField<T, TConverter> overloads.
Changed all Activator.CreateInstance calls to use compiled expression trees to create them instead.
Changed mapping for ConvertUsing to accept a Func so a block expression can be used.
Issue where writing with Configuration.QuoteAllFields enabled will not quote the quotes inside the field.
Issue where writing with Configuration.QuoteAllFields enabled will not quote the quotes inside the field.
Issue with WinRT not building after pull request merge.
Parse full line on read. This allows for the parser to retain the whole unchanged raw CSV lin on a read.
Parse full line on read. This allows for the parser to retain the whole unchanged raw CSV lin on a read.
Changed delimiter config from a char to a string.
Iterating records multiple times will throw a CsvReaderException. This is to help stop confusion when 0 results are returned the second iteration.
Issue where EnumConverter isn't created correctly from the TypeConverterFactory.
Issue with updating count for all closing quotes.
Configuration to always not quote all fields.
Configuration to always not quote all fields.
WriteHeader method is public.
Added enum converter.
Issue with boolean converter returning true for "no" value.
Issue with GetMethod in WinRT.
Issue where an exception was being thrown when reading all records multiple times.
#### Features - WinRT support.
Better exception information added to CsvBadDataException.
Mapping property for CreateUsing which allows user to specify how the property gets created.
Issue with skipping empty records.
Issue with detecting column count changes.
Added properties to CsvReaderException to give more information about the error.
Added properties to CsvReaderException to give more information about the error.
Ability to skip empty records based on config settings.
Getting by index that doesn't exist will give a default or CsvMissingFieldException.
Made column count detection a config setting.
Map option for constructing the row object.
Throw exception when inconsistent column lengths are detected.
String.Format support in CsvWriter.
Excel compatible parsing.
Parser can keep track of the byte position using an encoding so a user can seek to a stream and start reading from there.
Fixed bug with column count detection.
Issue with double counting the closing quote.
Issue where parsing was incorrect when the last row didn't have a CRLF at the end.
Issue with error messages.
Writer overload for shouldQuote when writing a field.
Writer overload for shouldQuote when writing a field.
Ability for using alternative names for headers in the configuration.
Better error messages.
Configuration to quote all fields when writing.
Configuration to quote all fields when writing.
Parser keeps a char count of where it's at.
Custom boolean type converter that can convert from 1 and 0 besides the normal conversion.
Custom boolean type converter that can convert from 1 and 0 besides the normal conversion.
Property map configuration to set a default value.
CsvWriter no longer flushes to the output stream after every record.
Non-generic overloads for reading, writing, and attribute mapping.
Invalidate record cache will clear the properties list.
Support .NET 2.0 and 3.5 builds.
Case insensitive header matching.
Property reference mapping. One level deep.
Removed CsvHelper class.
Property reference mapping. One level deep.
Support for multiple duplicate header names.
Issue when using a readonly or writeonly stream and disposing causes an exception.
Updated CsvHelper.cs to allow for readonly and writeonly stream.
Changed .NET 3.5 project to client profile.
Changed .NET 3.5 project to client profile.
Added getter for the current record in the header.
Changed strict mode to default to true.
Changed strict mode to default to true.
Renamed strict mode configuration property.
Changed reader to not throw an exception when there are duplicate header records unless in strict mode.
Fixed bug where if there is no line ending at the end of the file, the last field would be null instead of an empty string.
Fixed configuration references and constructor signatures.
Added configuration option for using CultureInvariant to read/write.
Added configuration option for using CultureInvariant to read/write.
Updated the reader/writer to use the config option.
Both CsvReader and CsvWriter are using Local culture when converting from/to strings.
CsvClassMap without generic argument.
Changed TryGetField to do a low level check instead of jsut wrapping in try/catch blocks.
Changed TryGetField to do a low level check instead of jsut wrapping in try/catch blocks.
Removed non generic TryGetField methods.
Formatting changes.
Changed CsvParser to use the Configuration.Comment char instead of #.
Changed GetRecords to return IEnumerable .
Changed GetRecords to return IEnumerable .
Added convenience constructor to CsvPropertyMap.
Major configuration overhaul.
Changed end of file check to be more low level.
Final record is returned if there is a trailing delimiter.
Added an exception re-throw to parsing that tells the line and character number.
Added ability to change what the quote char is.
Added CSV specific exceptions.
Changed StreamReader to TextReader to be more generic.
Added option to have a commented out line using '#' as the first character of the line.
Nothing published for this version
Update to .NET Core 1.0 release.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Fixed issue with writing an array of records.
Your coding agent can read these notes before it upgrades. Set up the MCP server →