我有一个充满记录的文本文件,其中每个记录中的每个字段都是固定宽度.我的第一种方法是使用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类.
使用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);
为什么重新发明轮子?根据Visual Basic的本方法使用.NET的TextFieldParser类.
子串对我来说听起来不错.我能立即想到的唯一缺点就是它意味着每次都要复制数据,但在你证明它是一个瓶颈之前我不会担心.子串很简单:)
您可以使用正则表达式一次匹配整个记录并捕获字段,但我认为这将是过度的.