2015-07-06 7 views
1

FileHelpers поддерживает функцию «RunTime Records», которая позволяет читать текстовый файл с фиксированной длиной в DataTable, когда вы не знаете макет до выполнения.Динамическое создание текстового файла с фиксированной длиной с помощью FileHelpers

Можно ли использовать FileHelpers для export a Файл с фиксированной длиной во время выполнения таким же образом?

ответ

2

Вот рабочий образец для экспорта с использованием источника DataTable.

public static class DataTableExtensions 
{ 
    public static List<object> DataTableToList(this DataTable table, Type type) 
    { 
     List<object> list = new List<object>(); 
     foreach (var row in table.AsEnumerable()) 
     { 
      object obj = Activator.CreateInstance(type); 
      foreach (var field in obj.GetType().GetFields()) 
      { 
       FieldInfo fieldInfo = obj.GetType().GetField(field.Name); 
       fieldInfo.SetValue(obj, Convert.ChangeType(row[field.Name], fieldInfo.FieldType)); 
      } 
      list.Add(obj); 
     } 

     return list; 
    } 
} 

class Program 
{ 
    private static void Main(string[] args) 
    { 
     var cb = new FixedLengthClassBuilder("Customer"); 

     cb.AddField("BirthDate", 8, typeof(DateTime)); 
     cb.LastField.Converter.Kind = ConverterKind.Date; 
     cb.LastField.Converter.Arg1 = "ddMMyyyy"; 
     cb.LastField.FieldNullValue = DateTime.Now; 

     cb.AddField("Name", 3, typeof(string)); 

     cb.AddField("Age", 3, typeof(int)); 
     cb.LastField.TrimMode = TrimMode.Both; 

     Type recordClass = cb.CreateRecordClass(); 

     var dataTable = new DataTable("Customer"); 
     dataTable.Columns.Add("BirthDate", typeof(DateTime)); 
     dataTable.Columns.Add("Name", typeof(string)); 
     dataTable.Columns.Add("Age", typeof(int)); 

     dataTable.Rows.Add(new DateTime(1972, 8, 14), "Joe", 42); 
     dataTable.Rows.Add(new DateTime(1971, 9, 15), "Tine", 43); 

     var list = dataTable.DataTableToList(recordClass); 

     var engine = new FileHelperEngine(recordClass); 
     engine.WriteFile(filename, list); 

     Console.ReadKey(); 
    } 
} 
+0

Спасибо Shamp00, код, который вы указали, предназначен для импорта и его работы. Фактически я ищу решение для экспорта данных DataTable в файл с фиксированной длиной, используя «Run time class/records». Ценю вашу помощь. – Manoj

+0

Gotcha. Легко использовать динамические переменные. Я отредактировал свой ответ. – shamp00

+0

Спасибо Shamp00, Это очень близко, я смотрю. Но в моей программе я фактически получаю данные из базы данных в DataTable для экспорта. Вы хоть представляете, как преобразовать DataTable в коллекцию IEnumerable типа d "Runtime class/Record". Здесь информация о полях записей классов настраивается пользователем (поддерживается информация полей в БД) и динамическая. Не могли бы вы помочь по этому вопросу? – Manoj

Смежные вопросы