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
Added the rest of the mapping and attributes configuration for constructor parameters.
Added the rest of the mapping and attributes configuration for constructor parameters.
Reading speed improvement.
Added IParameterMapper to BooleanFalseValuesAttribute , BooleanTrueValuesAttribute , ConstantAttribute , CultureInfoAttribute , DateTimeStylesAttribute , DefaultAttribute , FormatAttribute , HeaderPrefixAttribute , IgnoreAttribute , NameIndexAttribute , NullValuesAttribute , NumberStylesAttribute , OptionalAttribute , and TypeConverterAttribute .
Renamed MapTypeConverterOption to MemberMapTypeConverterOptions .
Renamed TypeConverterOptions.NumberStyle to TypeConverterOptions.NumberStyles .
Removed ReflectionHelper.CreateInstance<T> .
Removed ReflectionHelper.CreateInstance .
Removed ReflectionHelper.CreateInstanceWithoutContractResolver .
Nothing published for this version
One column per quarter.
Nothing published for this version
Added parameter mapping via class map or attributes.
NameAttribute added interface IParameterMapper .
IndexAttribute added interface IParameterMapper .
Fixed issue where EnumConverter wasn't working if enum value wasn't an Int32.
ValidateHeader will validate all members before calling HeaderValidated.
Action<bool, string[], int, ReadingContext> IReaderConfiguration.HeaderValidated -> Action<InvalidHeader[], ReadingContext> IReaderConfiguration.HeaderValidated
Action<bool, string[], int, ReadingContext> CsvConfiguration.HeaderValidated -> Action<InvalidHeader[], ReadingContext> CsvConfiguration.HeaderValidated
ConfigurationFunctions.HeaderValidated signature changed from (bool isValid, string[] headerNames, int headerNameIndex, ReadingContext context) to (InvalidHeader[] invalidHeaders, ReadingContext context)
CsvReader.ValidateHeader(ClassMap map) -> CsvReader.ValidateHeader(ClassMap map, List<InvalidHeader> invalidHeaders)
Removed HeaderValidationException.HeaderNames .
Removed HeaderValidationException.HeaderNameIndex .
Added InvalidHeader[] HeaderValidationException.InvalidHeaders .
Added ability to put [Name] attribute on enum values.
Added ability to put [Name] attribute on enum values.
Added ability to register a converter for Enum that will be a default for all enum types.
GetRecords throws ObjectDisposedException when CsvReader is disposed. A message hint was added to help the user understand what went wrong.
Ability to have duplicate header names when using dynamic records.
Added Func<ReadingContext, int, string> IReaderConfiguration.GetDynamicPropertyName .
Added Func<ReadingContext, int, string> CsvConfiguration.GetDynamicPropertyName .
Fixed IgnoreAttribute to ignore the whole property treey if put on a reference property when auto mapped.
Fixed issue where CsvDataReader.FieldCount was throwing an exception if there were no records.
Fixed CsvDataReader.GetOrdinal issue where it wasn't doing a case-insensitive match after a failed case-sensitive match. Run values through PrepareHea
Fixed issue where writing null to WriteField didn't output a field.
#### Bug Fixes - Fixed test not building.
Fixed issue with multiple character delimiter not working when the first char of the delimiter precedes the actual delimiter.
Fixed issue with ReflectionHelper caching not always unique.
Updated default number styles for DecimalConverter and DoubleConverter to match MS's recommendations.
Fixed issue with DataReader.GetValues not working when column and rows have different count.
Nothing published for this version
Ignore attribute on a reference will ignore all properties on that reference.
Added IAsyncDispose on writing classes.
Added dependency <PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.3" /> to net45 .
Added dependency <PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.3" /> to net47 .
Added dependency <PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.3" /> to netstandard2.0 .
IWriter added interface IAsyncDisposable for net47 and netstandard2.1 .
ISerializer added interface IAsyncDisposable for net47 and netstandard2.1 .
WritingContext added interface IAsyncDisposable for net47 and netstandard2.1 .
CsvWriter added methods public async ValueTask DisposeAsync() and protected virtual async ValueTask DisposeAsync(bool disposing) for net47 and netstandard .
CsvSerializer added methods public async ValueTask DisposeAsync() and protected virtual async ValueTask DisposeAsync(bool disposing) for net47 and netstandard .
WritingContext added methods public async ValueTask DisposeAsync() and protected virtual async ValueTask DisposeAsync(bool disposing) for net47 and netstandard .
Nothing published for this version
Added required CultureInfo parameter to any class that uses CultureInfo.
Added netstandard2.1 build.
Added required CultureInfo parameter to any class that uses CultureInfo.
Apply member attributes using interface instead of hard coding.
Added customizable new line when writing. You can choose from CRLF , CR , LF , or Environment.NewLine .
Renamed Configuration to CsvConfiguration to avoid namespace conflicts.
Added GetRecordsAsync and WriteRecordsAsync .
Removed dependency <PackageReference Include="System.Reflection.TypeExtensions" Version="4.4.0" /> from netstandard2.0 .
Removed dependency <PackageReference Include="System.Reflection.TypeExtensions" Version="4.4.0" /> from netstandard2.1 .
Added dependency <PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="1.1.0" /> to net47 .
Added dependency <PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="1.1.0" /> to netstandard2.0 .
ClassMap.AutoMap() -> ClassMap.AutoMap(CultureInfo)
CsvParser.CsvParser(TextReader) -> CsvParser.CsvParser(TextReader, CultureInfo)
CsvParser.CsvParser(TextReader, bool) -> CsvParser.CsvParser(TextReader, CultureInfo, bool)
CsvReader.CsvReader(TextReader) -> CsvReader.CsvReader(TextReader, CultureInfo)
CsvReader.CsvReader(TextReader, bool) -> CsvReader.CsvReader(TextReader, CultureInfo, bool)
CsvSerializer.CsvSerializer(TextWriter) -> CsvSerializer.CsvSerializer(TextWriter, CultureInfo)
CsvSerializer.CsvSerializer(TextWriter, bool) -> CsvSerializer.CsvSerializer(TextWriter, CultureInfo, bool)
CsvWriter.CsvWriter(TextWriter) -> CsvWriter.CsvWriter(TextWriter, CultureInfo)
CsvWriter.CsvWriter(TextWriter, bool) -> CsvWriter.CsvWriter(TextWriter, CultureInfo, bool)
Factory.CreateParser(TextReader) -> Factory.CreateParser(TextReader, CultureInfo)
Factory.CreateReader(TextReader) -> Factory.CreateReader(TextReader, CultureInfo)
Factory.CreateWriter(TextWriter) -> Factory.CreateWriter(TextWriter, CultureInfo)
IFactory.CreateParser(TextReader) -> IFactory.CreateParser(TextReader, CultureInfo)
IFactory.CreateReader(TextReader) -> IFactory.CreateReader(TextReader, CultureInfo)
IFactory.CreateWriter(TextWriter) -> IFactory.CreateWriter(TextWriter, CultureInfo)
Added ISerializerConfiguration.NewLine .
Added ISerializerConfiguration.NewLineString .
Added Configuration.NewLine .
Added Configuration.NewLineString .
Removed Configuration.Configuration() parameterless constructor.
Attributes now require the use of IMemberMapper or IMemberReferenceMapper to be loaded. All existing attributes added these and implemented the interface.
Renamed Configuration to CsvConfiguration .
Added IAsyncEnumerable<T> CsvReader.GetRecordsAsync<T>()
Added IAsyncEnumerable<T> CsvReader.GetRecordsAsync<T>(T anonymousTypeDefinition)
Added IAsyncEnumerable<object> CsvReader.GetRecordsAsync(Type type)
Added IAsyncEnumerable<T> CsvReader.EnumerateRecordsAsync<T>(T record)
Added Task CsvWriter.WriteRecordsAsync(IEnumerable records)
Added Task CsvWriter.WriteRecordsAsync<T>(IEnumerable<T> records)
Added IAsyncEnumerable<T> IReader.GetRecordsAsync<T>()
Added IAsyncEnumerable<T> IReader.GetRecordsAsync<T>(T anonymousTypeDefinition)
Added IAsyncEnumerable<object> IReader.GetRecordsAsync(Type type)
Added IAsyncEnumerable<T> IReader.EnumerateRecordsAsync<T>(T record)
Added Task IWriter.WriteRecordsAsync(IEnumerable records)
Added Task IWriter.WriteRecordsAsync<T>(IEnumerable<T> records)
Changed double and single converters to only test for format "R" if the user hasn't supplied a format.
Fix for bug in .NET Framework that causes a StackOverflowException. This needs to be changed back eventually.
#### Features - Added UriConverter.
Changed round trip default format to test if "R" works and use backup of "G9" for float and "G17" for double.
Fixed issue where multiple properties with the same name were used when a child class property hides a parent class property using the new modifier.
Fixed issue where multiple properties with the same name were used when a child class property hides a parent class property using the new modifier.
Fixed issue where a null reference exception was thrown when writing and all properties are ignored.
Fixed issue where an "Index out of bounds of the array" exception was happening on TryGetField of type DateTime.
Fixed issue where an "Index out of bounds of the array" exception was happening on TryGetField of type DateTime.
Fix RawRecord adding spaces if TrimOptions.Trim is used.
Allow default value when using optional members.
Allow default value when using optional members.
Added BigIntConverter.
Mapping to member with type Type will throw exception by default.
Always write \r\n line endings to be compliant with RFC 4180.
Fixed issue where CsvDataReader would skip the first row when there is no header record.
Fixed issue where CsvDataReader would skip the first row when there is no header record.
Fixed CsvDataReader issue where null values weren't being represented as DBNull.Value on GetValue and GetValues methods.
Fixed issue with IsDBNull method where an empty string was considered a null.
Fixed issue where CsvReader.ReadAsync wasn't behaving the same as CsvReader.Read .
Added constructor to Configuration to pass in the CultureInfo . When passing a culture in, the Delimiter will be set to CultureInfo.TextInfo.ListSepar
Fixed issue where writing a dynamic object would still sort the header when no sort was specified.
Added config option for sorting dynamic object properties when writing. Defaults to property value set order.
Added IComparer<string> IWriterConfiguration.DynamicPropertySort .
Added IComparer<string> Configuration.DynamicPropertySort .
Fixed issue with leaveOpen not being used in the context's dispose.
Removed config options QuoteAllFields , QuoteNoFields , QuoteRequiredChars , and BuildREquiredQuoteChars in favor of ShouldQuote function.
Removed IWriterConfiguration.QuoteAllFields .
Removed IWriterConfiguration.QuoteNoFields .
Removed IWriterConfiguration.QuoteRequiredChars .
Removed IWriterConfiguration.BuildRequiredQuoteChars .
Removed Configuration.QuoteAllFields .
Removed Configuration.QuoteNoFields .
Removed Configuration.QuoteRequiredChars .
Removed Configuration.BuildRequiredQuoteChars .
Added Func<string, WritingContext, bool> IWriterConfiguration.ShouldQuote .
Added Func<string, WritingContext, bool> Configuration.ShouldQuote .
Added a more friendly header validation message.
Added a more friendly header validation message.
Separated header and field validation exceptions.
Added data properties to validation classes.
Changed Configuration.ReadingExceptionOccurred to not throw an exception and return a boolean whether it should throw an exception. The caller will throw if true.
Changed NamedIndexCache type from Tuple<string, int> to (string, int) .
Config option to consider a line break in a quoted field as bad data.
Changed delimiter default value from ',' to CultureInfo.CurrentCulture.TextInfo.ListSeparator.
PrepareHeaderForMatch now passes in the header name and index.
Dynamic records will now have null properties for missing fields.
Write ExpandoObject and IDynamicMetaObjectProvider object properties in ascending order to ensure order of property creation doesn't matter.
Added escape character configuration.
Added IDataReader implementation. This allows for easily loading a DataTable.
Nothing published for this version
Nothing published for this version
Fixed issue where TrimOptions.InsideQuotes would fail when there were escaped quotes in the field.
Fixed issue where NamedIndexes wasn't being reset on ReadHeader call.
Fixed issue where a TypeConverterAttribute isn't being used when on a reference.
More clear exception messages when reading and a missing field is found.
Allow parameterless constructor on classes and reference property classes when auto mapping.
Fixed issue where WriteAsync wasn't calling SanitizeForInjection .
Fixed issue where leaveOpen parameter in CsvParser constructor was hard coded.
Fixed issue where leaveOpen parameter in CsvParser constructor was hard coded.
Fixed issue where header validation was being ran on properties that only had an index mapped.
This release contains changes from 8.3.0 and 8.2.0.
This release contains changes from 8.3.0 and 8.2.0.
This has been unlisted in nuget because of a breaking change before it. The changes are in 9.0.0.
This has been unlisted in nuget because of a breaking change before it. The changes are in 9.0.0.
This has been unlisted in nuget because of a breaking change. The changes are in 9.0.0.
This has been unlisted in nuget because of a breaking change. The changes are in 9.0.0.
Added Optional config to factory builder.
Added OptionalAttribute .
Added IHasMapOptions : IHasOptional .
Added MemberMapBuilder : IHasOptional .
Added MemberMapBuilder : IHasOptionalOptions .
Configuration functions are available on a static class ConfigurationFunctions .
Added IsOptional mapping option.
Added IsOptional mapping option.
Added Unity build.
Added IsOptional mapping option.
Added missing interface methods to configs.
Fixed issue with parsing when only CR is used and fields are quoted.
Fixed issue where GetField was calling the ObjectResolver .
Made the contexts not serializable in exceptions.
Fixed issue with ObjectResolver fallback causing a StackOverflowException .
Added IReaderConfiguration.IgnoreReferences .
Added IWriterConfiguration.IgnoreReferences .
Nothing published for this version
Added constructor to CsvWriter that allows for leaveOpen to be set.
Added constructor to CsvWriter that allows for leaveOpen to be set.
Made CsvWriter.Dispos e able to be called multiple times.
Added ConfigureAwait(false) to all async calls.
Changed record object creation to use the ObjectResolver .
Allow private constructors to be used to instantiate new class instances.
Reading performance improvements.
Fixed issue with circular references when auto mapping.
Your coding agent can read these notes before it upgrades. Set up the MCP server →