C# 使用FileHelpers动态创建固定长度的文本文件
FileHelpers支持一个名为“运行时记录”的功能,该功能允许您在运行时才知道布局时将固定长度的文本文件读入数据表C# 使用FileHelpers动态创建固定长度的文本文件,c#,filehelpers,fixed-length-file,C#,Filehelpers,Fixed Length File,FileHelpers支持一个名为“运行时记录”的功能,该功能允许您在运行时才知道布局时将固定长度的文本文件读入数据表 是否可以使用FileHelpers在运行时以相同的方式导出固定长度的文件?以下是一个使用数据表作为源导出的工作示例 public static class DataTableExtensions { public static List<object> DataTableToList(this DataTable table, Type type)
是否可以使用FileHelpers在运行时以相同的方式导出固定长度的文件?以下是一个使用
数据表作为源导出的工作示例
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();
}
}
公共静态类DataTableExtensions
{
公共静态列表DataTableToList(此DataTable表,类型)
{
列表=新列表();
foreach(表中的var行。AsEnumerable())
{
object obj=Activator.CreateInstance(类型);
foreach(obj.GetType().GetFields()中的变量字段)
{
FieldInfo FieldInfo=obj.GetType().GetField(field.Name);
fieldInfo.SetValue(obj,Convert.ChangeType(行[field.Name],fieldInfo.FieldType));
}
列表。添加(obj);
}
退货清单;
}
}
班级计划
{
私有静态void Main(字符串[]args)
{
var cb=新的固定长度类生成器(“客户”);
cb.AddField(“生日”,8,类型(日期时间));
cb.LastField.Converter.Kind=ConverterKind.Date;
cb.LastField.Converter.Arg1=“ddMMyyyy”;
cb.LastField.FieldNullValue=DateTime.Now;
cb.AddField(“Name”,3,typeof(string));
cb.AddField(“年龄”,3,类型(int));
cb.LastField.TrimMode=TrimMode.Both;
类型recordClass=cb.CreateRecordClass();
var数据表=新数据表(“客户”);
dataTable.Columns.Add(“生日”,typeof(DateTime));
dataTable.Columns.Add(“Name”,typeof(string));
dataTable.Columns.Add(“年龄”,typeof(int));
dataTable.Rows.Add(新日期时间(1972,8,14),“Joe”,42);
dataTable.Rows.Add(新的日期时间(1971,9,15),“Tine”,43);
var list=dataTable.DataTableToList(记录类);
var引擎=新文件HelperEngine(recordClass);
engine.WriteFile(文件名,列表);
Console.ReadKey();
}
}
谢谢Shamp00,您提供的代码用于导入,工作正常。实际上,我正在寻找使用“运行时类/记录”将DataTable数据导出到固定长度文件的解决方案。谢谢你的帮助,明白了。如果使用动态
变量,这很容易。我已经编辑了我的答案。谢谢Shamp00,这是非常接近我正在寻找。但在我的程序中,我实际上将数据从DB中获取到DataTable中进行导出。您知道如何将DataTable转换为d“Runtime class/Record”类型的IEnumerable集合吗。在这里,记录类字段信息是用户可配置的(在DB中维护字段信息)和动态的。您能在这方面提供帮助吗?那么最好使用helper类进行DataTable
字段映射。我再次编辑了我的答案。完美解决方案Shamp00!!!!很好的例子。再次感谢您的帮助,Shamp00!!!