FileHelpers 动态固定字段位置

FileHelpers dynamic fixed field positions

当位置仅在 运行 时已知时,是否可以 parse/read 固定位置布局平面文件?我看到关于 SO 的问题与使用 'Runtime Records' 的类似内容有关,但这与读取分隔文件有关 -

我的意图是将不同定长格式的定长平面文件解析为通用格式,并在运行时加载定长格式。 FileHelpers倾向于使用属性来定义字段的位置和长度,这是预先定义的,但我想在运行时指定。

谢谢。

这就是我所做的。希望对你有帮助。

  1. 创建了数据库table并存储了不同的固定文件布局格式(如字段名称大小、数据类型和字段长度等...)
  2. 在 UI 中,首先用户选择固定文件布局,然后选择要导入的固定文件。
  3. 基于选定的布局,我使用以下代码在 运行 时间创建固定长度类型 class。

</p>

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;
    }