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

Chr*_*her 18 .net c# parsing fixed-width

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

例如,格式可以描述为:

<Field1(8)><Field2(16)><Field3(12)>
Run Code Online (Sandbox Code Playgroud)

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

SomeData0000000000123456SomeMoreData
Data2   0000000000555555MoreData    
Run Code Online (Sandbox Code Playgroud)

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


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

private readonly Regex reLot = new Regex(REGEX_LOT, RegexOptions.Compiled);
const string REGEX_LOT = "^(?<Field1>.{6})" +
                        "(?<Field2>.{16})" +
                        "(?<Field3>.{12})";
Run Code Online (Sandbox Code Playgroud)

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

Match match = reLot.Match(record);
string field1 = match.Groups["Field1"].Value;
Run Code Online (Sandbox Code Playgroud)

小智 27

使用FileHelpers.

例:

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

  [FieldFixedLength(16)] 
  public int SomeNumber; 

  [FieldFixedLength(12)] 
  [FieldTrim(TrimMode.Right)]
  public string someMoreData;
}
Run Code Online (Sandbox Code Playgroud)

然后,它就像这样简单:

var engine = new FileHelperEngine<MyData>(); 

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

// To Write Use: 
engine.WriteFile("FileOut.txt", res); 
Run Code Online (Sandbox Code Playgroud)

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

Col*_*nic 7

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


Jon*_*eet 5

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

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