CsvHelper ConvertUsing does not change output

I am trying to use the ConvertUsing method of the ConvertUsing library (v 2.4.0).

I read the documentation about ConvertUsing but can't get it working.

I use a simple class:

 public class Test { public long Id { get; set; } public string Title { get; set; } } 

With this ClassMap :

 public class TestClassMap : CsvClassMap<Test> { public override void CreateMap() { Map(m => m.Id).Name("id").ConvertUsing(row => 11111); Map(m => m.Title).Name("title").ConvertUsing(row => row.GetField("title") + " 123"); } } 

My code that uses them creates an instance of the class and then writes it to CSV:

 var test = new Test() { Id = 99, Title = "Test title" }; using (var streamWriter = new StreamWriter("test.csv")) { var csv = new CsvWriter(streamWriter); csv.Configuration.RegisterClassMap<TestClassMap>(); csv.WriteRecord(test); } 

However, the output file test.csv always has the following format:

 id,title 99,Test title 

The result I'm looking for is:

 id,title 11111,Test title 123 

And ConvertUsing ignored. I tried to convert only Id and only Title , but this also does not work.

Any ideas I'm wrong about?

+8
c # csv export-to-csv csvhelper
source share
2 answers

ConvertUsing is ConvertUsing used only for reading.

You can use a custom type converter if you want to customize the output. You also have some limited options through type converter options.

+10
source share

I had a similar need, and this is exactly what I did to change the contents before saving it to a csv file.

I have my own StringNormalizer class that implements the CsvHelper.TypeConversion.ITypeConverter interface.

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using CsvHelper.TypeConversion; namespace MyNamespaceInHere { public class StringNormalizer : ITypeConverter { public bool CanConvertFrom(Type type) { if (type == typeof(string)) return true; return false; } public bool CanConvertTo(Type type) { if (type == typeof(string)) return true; return false; } public object ConvertFromString(TypeConverterOptions options, string text) { return normalize(text); } public string ConvertToString(TypeConverterOptions options, object value) { if (value == null) return string.Empty; if (value.GetType() == typeof(string)) { string str = (string)value; return normalize(str); } return string.Empty; } public string normalize(string field) { // Do stuff in here and return normalized string return field + " just a sample"; } } } 

Then in my main program, where I defined the mappings, I use it like this:

 public sealed class ConMap : CsvClassMap<Contact> { public override void CreateMap() { Map(m => m.FirstName).Name("FirstName").TypeConverter<StringNormalizer>(); } } 

Thus, everything that is saved in csv will “skip” my string normalizer.

+7
source share

All Articles