当前位置:  开发笔记 > 编程语言 > 正文

从文本文件中读取固定宽度记录

如何解决《从文本文件中读取固定宽度记录》经验,为你挑选了3个好方法。

我有一个充满记录的文本文件,其中每个记录中的每个字段都是固定宽度.我的第一种方法是使用string.Substring()解析每条记录.有没有更好的办法?

例如,格式可以描述为:


并且具有两个记录的示例文件可能如下所示:

SomeData0000000000123456SomeMoreData
Data2   0000000000555555MoreData    

我只是想确保我没有忽略比Substring()更优雅的方式.


更新: 我最终选择了Killersponge建议的正则表达式:

private readonly Regex reLot = new Regex(REGEX_LOT, RegexOptions.Compiled);
const string REGEX_LOT = "^(?.{6})" +
                        "(?.{16})" +
                        "(?.{12})";

然后我使用以下内容访问字段:

Match match = reLot.Match(record);
string field1 = match.Groups["Field1"].Value;

小智.. 27

使用FileHelpers.

例:

[FixedLengthRecord()] 
public class MyData
{ 
  [FieldFixedLength(8)] 
  public string someData; 

  [FieldFixedLength(16)] 
  public int SomeNumber; 

  [FieldFixedLength(12)] 
  [FieldTrim(TrimMode.Right)]
  public string someMoreData;
}

然后,它就像这样简单:

var engine = new FileHelperEngine(); 

// To Read Use: 
var res = engine.ReadFile("FileIn.txt"); 

// To Write Use: 
engine.WriteFile("FileOut.txt", res); 

-1表示外部库依赖解决方案,次优. (2认同)


Colonel Pani.. 7

为什么重新发明轮子?根据Visual Basic的本方法使用.NET的TextFieldParser类.



1> 小智..:

使用FileHelpers.

例:

[FixedLengthRecord()] 
public class MyData
{ 
  [FieldFixedLength(8)] 
  public string someData; 

  [FieldFixedLength(16)] 
  public int SomeNumber; 

  [FieldFixedLength(12)] 
  [FieldTrim(TrimMode.Right)]
  public string someMoreData;
}

然后,它就像这样简单:

var engine = new FileHelperEngine(); 

// To Read Use: 
var res = engine.ReadFile("FileIn.txt"); 

// To Write Use: 
engine.WriteFile("FileOut.txt", res); 


-1表示外部库依赖解决方案,次优.

2> Colonel Pani..:

为什么重新发明轮子?根据Visual Basic的本方法使用.NET的TextFieldParser类.



3> Jon Skeet..:

子串对我来说听起来不错.我能立即想到的唯一缺点就是它意味着每次都要复制数据,但在你证明它是一个瓶颈之前我不会担心.子串很简单:)

可以使用正则表达式一次匹配整个记录并捕获字段,但我认为这将是过度的.

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有