FileHelpers动态固定字段位置
本文关键字:字段 位置 动态 FileHelpers | 更新日期: 2023-09-27 18:12:16
当位置仅在运行时已知时,是否可以解析/读取固定位置布局平面文件?我看到有一个关于SO的问题,涉及到使用"运行时记录"类似的东西,但这涉及到读取一个分隔的文件-使用FileHelpers动态创建固定长度的文本文件
我的意图是将具有不同固定长度格式的固定长度平面文件解析为通用格式,并且在运行时加载固定长度格式。FileHelpers倾向于使用属性来定义字段的位置和长度,这是预先定义的,但我想在运行时指定。
谢谢。
我就是这么做的。希望能对你有所帮助。
- 创建DB表并存储不同的固定文件布局格式(如字段名称大小,数据类型和字段长度等)
- 在UI中,用户首先选择固定文件布局,然后选择要导入的固定文件。
- 基于选定的布局,我在运行时使用以下代码创建固定长度的Type类。
private void ImportFiles()
{
DataTable dt = GetFixedFileSpecsFromDB(layoutName); //Get the specs
//Create Dynamic class based on Specs above
FixedLengthClassBuilder cb = GetSpecClass(dt);
//Create FileHelpers engine instance
FileHelperEngine engine = new FileHelperEngine(cb.CreateRecordClass());
//Read file data into Data table
DataTable dtImportData = engine.ReadFileAsDT(ImportFilePath);
}
//Method to create the Fixed lentgh dynamic class
public static FixedLengthClassBuilder GetSpecClass(DataTable dt)
{
string className = "ImportSpecifications";
FixedLengthClassBuilder cb = new FixedLengthClassBuilder(className);
//Loop thru each field and prepare the class
foreach (DataRow dr in dt.Rows)
{
int fieldLength = Convert.ToInt32(dr.Field<decimal>("FieldLength"));
switch (dr["FieldDataType"].ToString())
{
case "String":
cb.AddField(dr.Field<string>("FieldName"), fieldLength, typeof(string));
cb.LastField.FieldNullValue = string.Empty;
cb.LastField.TrimMode = FileHelpers.TrimMode.Both;
break;
case "Date":
cb.AddField(dr.Field<string>("FieldName"), fieldLength, typeof(DateTime));
cb.LastField.FieldNullValue = string.Empty;
break;
case "Integer":
cb.AddField(dr.Field<string>("FieldName"), fieldLength, typeof(int?));
//cb.LastField.FieldNullValue = 0;
break;
case "Long Integer":
cb.AddField(dr.Field<string>("FieldName"), fieldLength, typeof(long));
cb.LastField.FieldNullValue = 0;
break;
case "Decimal":
cb.AddField(dr.Field<string>("FieldName"), fieldLength, typeof(decimal?));
//cb.LastField.FieldNullValue = 0;
break;
default:
break;
}
}
return cb;
}