【问题标题】:Dynamically create a Fixed Length text file with FileHelpers使用 FileHelpers 动态创建一个固定长度的文本文件
【发布时间】:2015-07-06 17:04:04
【问题描述】:

FileHelpers 支持一种称为“运行时记录”的功能,当您在运行时才知道布局时,它可以让您将固定长度的文本文件读入 DataTable。

是否可以使用 FileHelpers 在运行时以相同的方式导出固定长度文件?

【问题讨论】:

    标签: c# filehelpers fixed-length-file


    【解决方案1】:

    这是一个使用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();
        }
    }
    

    【讨论】:

    • 感谢 Shamp00,您提供的代码用于导入,并且工作正常。实际上,我正在寻找使用“运行时类/记录”将 DataTable 数据导出到固定长度文件的解决方案。感谢您的帮助。
    • 明白了。如果您使用dynamic 变量,这很容易。我已经编辑了我的答案。
    • 感谢Shamp00,我正在寻找这非常接近。但在我的程序中,我实际上将数据从 DB 获取到 DataTable 中以进行导出。您是否知道如何将 DataTable 转换为 d"Runtime class/Record" 类型的 IEnumerable 集合。这里记录类字段信息是用户可配置的(在数据库中维护字段信息)和动态的。你能帮忙吗
    • 那么最好使用辅助类进行DataTable 字段映射。我再次编辑了我的答案。
    • 完美解决洗发水00!!!!很好的例子。再次感谢您的帮助 Sham00!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 2021-09-17
    • 2014-02-22
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    相关资源
    最近更新 更多