从文本文件中读取固定宽度的logging

我有一个文本文件充满logging每个logging中的每个字段是固定的宽度。 我的第一种方法是简单地使用string.Substring()来parsing每条logging。 有没有更好的办法?

例如,格式可以被描述为:

<Field1(8)><Field2(16)><Field3(12)> 

而具有两个logging的示例文件可能如下所示:

 SomeData0000000000123456SomeMoreData Data2 0000000000555555MoreData 

我只是想确保我不会比Substring()更优雅的方式。


更新:我最终与像Killersponge一样的正则expression式提出:

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

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

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

子串听起来不错。 我可以立即想到的唯一缺点是它意味着每次都要复制数据,但是直到certificate它是一个瓶颈之后,我才会担心这一点。 子串是简单的:)

可以使用正则expression式来匹配整个logging,并捕获这些字段,但是我认为这样做会过度。

使用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<MyData>(); // To Read Use: var res = engine.ReadFile("FileIn.txt"); // To Write Use: engine.WriteFile("FileOut.txt", res); 

为什么重新发明轮子? 使用.NET的TextFieldParser类按照此操作为Visual Basic 。

你可能不得不注意,如果行的末尾没有填充空格来填充字段,那么你的子string将不会工作,没有一点小窍门就可以计算出需要读取的行数。 这当然只适用于最后一个领域:)

不,子串是好的。 这就是它的目的。

不幸的是,CLR仅仅为此提供了子string。

有人在CodeProject上使用属性来定义字段的自定义分析器 ,你可能想看看。

您可以为固定格式的文件设置一个ODBC数据源,然后像任何其他数据库表一样访问它。 这还有一个好处,那就是在某个决定在中间插入一个额外字段的那一天,文件格式的特定知识不会被编译到你的代码中。