You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 00:10:14