Search code examples
c#genericsinterfacefilehelpers

how to create records for writing a csv file with FileHelpers


I am using Filehelpers to import my database from files. I am now working on the reverse process and am having trouble seeing how to create the records from my data objects.

All the examples I can find show going from file -> table -> file I am using interfaces with generics to convert. I use this one on the inbound conversion:

 public interface IConvertCSVRecordToType<T> where T : SimpleBase
  {
    T ConvertCSVRecordToType();
  }

and would like to use something like this for the outbound:

 public interface IConvertTypeToCSVRecord<T> where T : SimpleBase, new()
  {
    void ConvertTypeToCSVRecord(T type);
  }

I use this class to represent the CSV Records:

  [DelimitedRecord(";"), IgnoreEmptyLines]
  public class CSVRecordFormat : IConvertCSVRecordToType<Material>, 
                                 IConvertTypeToCSVRecord<Material>

I came across TransformToRecordAttribute in the Filehelpers documentation

TransformToRecordAttribute Class

With this attribute you can mark a method in the RecordClass that is the responsable of convert it to the specified.

Does anyone have an example that uses this attribute or an example of how to create a record set to get me in the right direction?


Solution

  • (rough) Code that worked with some details elided:

     public class CSVTableExportProvider<TTable, TRecord>
            where TTable : SimpleBase, new()
            where TRecord : IConvertTypeToCSVRecord<TTable>, new()
     {
        public void ExportTable(string path, string filename, bool continueOnError)
        {
          var rows = _service.GetList<TTable>();
          var records = new List<TRecord>();
    
          var csvfile = Path.Combine(path, filename);
    
          var csvFile = new CSVFile<TRecord>(csvfile, continueOnError);
    
            foreach (var row in rows)
            {
              var rec = new TRecord();
              rec.ConvertTypeToCSVRecord(row);
              records.Add(rec);
            }
            csvFile.ConvertRecordsToFile(records.ToArray());
         }
     }
    

    Which I call from my unit test:

     var provider = new CSVTableExportProvider<Material, MaterialCSVRecordFormat>();
     provider.ExportTable(foldername, filename, true);