从文本文件中读取固定宽度的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数据源,然后像任何其他数据库表一样访问它。 这还有一个好处,那就是在某个决定在中间插入一个额外字段的那一天,文件格式的特定知识不会被编译到你的代码中。