如何使用FileHelpers解析包含对象数组的固定宽度文件?
FileHelpers解析固定长度格式中的对象数组方案
完全可以用FileHelpers实现这种解析需求,匹配你期望的对象结构,具体实现方式如下:
核心思路
FileHelpers本身没有直接提供[SomeTypeOfFixedArray]这类属性,但可以通过自定义字段转换器来处理这部分数组内容:先把固定长度的整段字符串按单个元素的长度分割,再将每个片段反序列化为WritingInstrument对象,最终收集到列表中。
具体实现步骤
1. 编写自定义转换器
创建一个继承自ConverterBase的转换器,负责把150字符(10个元素×15字符/元素)的字符串片段,拆分为单个WritingInstrument对象并组装成列表:
public class WritingInstrumentArrayConverter : ConverterBase { public override object StringToField(string from) { var instruments = new List<WritingInstrument>(); var engine = new FixedLengthFileEngine<WritingInstrument>(); // 按每个元素15字符的长度分割整段字符串 for (int i = 0; i < from.Length; i += 15) { if (i + 15 > from.Length) break; var segment = from.Substring(i, 15).TrimEnd(); // 跳过空白片段(未填满的数组元素) if (string.IsNullOrWhiteSpace(segment)) continue; // 将单个15字符片段解析为WritingInstrument对象 var instrument = engine.ReadString(segment).FirstOrDefault(); if (instrument != null) { instruments.Add(instrument); } } return instruments; } // 如果需要序列化回固定长度字符串,实现反向逻辑 public override string FieldToString(object fieldValue) { var instruments = (List<WritingInstrument>)fieldValue; var engine = new FixedLengthFileEngine<WritingInstrument>(); var segments = instruments.Select(instr => engine.WriteString(new[] { instr }).TrimEnd('\r', '\n')); // 用空白填充到总长度150字符 return string.Join("", segments).PadRight(150); } }
2. 修改外层记录类
在OutterRecord中添加对应字段,用[FieldFixedLength(150)]标记总长度,并绑定自定义转换器:
[FixedLengthRecord] public class OutterRecord { [FieldFixedLength(1)] public string AField { get; set; } [FieldFixedLength(2)] public string BField { get; set; } [FieldFixedLength(3)] public string CField { get; set; } [FieldFixedLength(150)] [FieldConverter(typeof(WritingInstrumentArrayConverter))] public List<WritingInstrument> WritingInstruments { get; set; } }
验证效果
针对你给出的示例字符串:
ABBCCC10purple crayon5 red pencil9 green marker
前6字符会被解析为:
AField = "A"BField = "BB"CField = "CCC"
剩余部分会被拆分为三个15字符的片段,分别解析为对应的WritingInstrument对象,最终WritingInstruments列表会包含这三个元素。
内容的提问来源于stack exchange,提问作者Jason La
相关产品推荐
相关产品推荐

