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)
子串对我来说听起来不错.我能立即想到的唯一缺点就是它意味着每次都要复制数据,但在你证明它是一个瓶颈之前我不会担心.子串很简单:)
您可以使用正则表达式一次匹配整个记录并捕获字段,但我认为这将是过度的.