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
相关产品推荐
相关产品推荐

