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

ASP.NET MVC:如何按固定宽度拆分文本行并映射至模型

解决固定宽度文本行的列拆分问题

你现在的核心问题是误用了Split()方法——这个方法是按指定字符/字符串分割文本的,完全不适合处理固定位置的宽度截取场景。针对固定宽度的文本,我们应该用Substring()方法来精准提取每个列对应的文本段。

根据你给出的列位置规则:

  • 第1列:起始索引0,到第2列起始位置26,所以截取长度为26
  • 第2列:起始索引26,到第3列起始位置82,截取长度为82-26=56
  • 第3列:起始索引82,到第4列起始位置106,截取长度为106-82=24
  • 第4列:从索引106开始,截取到行尾

另外要注意:如果某些行的实际长度不足目标索引,直接调用Substring会抛出索引越界异常,所以我们需要先做长度判断,保证代码的健壮性。

修改后的Action代码如下:

public ActionResult Index() {
    string[] texts = System.IO.File.ReadAllLines(Server.MapPath("~/App_Data/Test/test.txt"));
    texts = texts.Skip(2).ToArray();
    List<Alarm_DataModel> Alarm_Data = new List<Alarm_DataModel>();
    
    foreach (string row in texts) {
        if (!string.IsNullOrEmpty(row)) {
            // 安全截取各列,避免索引越界
            var project = row.Length >= 26 ? row.Substring(0, 26).Trim() : row.Trim();
            var point = row.Length >= 82 ? row.Substring(26, 56).Trim() : (row.Length >26 ? row.Substring(26).Trim() : string.Empty);
            var timeStamp = row.Length >= 106 ? row.Substring(82, 24).Trim() : (row.Length >82 ? row.Substring(82).Trim() : string.Empty);
            var dataValue = row.Length > 106 ? row.Substring(106).Trim() : string.Empty;
            
            Alarm_Data.Add(new Alarm_DataModel {
                Project = project,
                Point = point,
                TimeStamp = timeStamp,
                DataValue = dataValue,
            });
        }
    }
    
    ViewBag.Data = texts;
    return View(Alarm_Data);
}

关键细节说明:

  • Substring(startIndex, length):第一个参数是起始索引,第二个是要截取的文本长度,完全匹配固定宽度的需求
  • 加上.Trim()是为了去除固定宽度文本中常见的补位空格,让数据更干净
  • 每个列都做了长度判断,当行长度不足时会根据实际情况截取剩余内容或返回空字符串,避免程序崩溃

这样就能正确按固定宽度拆分每行内容到你的模型属性中了。

内容的提问来源于stack exchange,提问作者user82989

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:15:48