gpt4 book ai didi

c# - 解析固定列宽的可变长度字符串 C#

转载 作者:太空狗 更新时间:2023-10-30 00:11:25 24 4
gpt4 key购买 nike

我正在尝试解析格式化为列的文本报告。每列似乎都以固定长度右对齐。对于每一行,有时并非所有列都被使用。在那种情况下,似乎使用空格来证明该行中的每一列。输入示例:

031   91    1221,154
043 66 312,222 1 3,047 3,047 1.5% .9%
040 118 529,626 1 1,842 1,842 .8% .3%
037 45 427,710
019 80 512,153 1 14,685 14,685 1.2% 2.8%
009 68 520,301 1 16,085 16,085 1.4% 3.0%
030 13 106,689 1 1,581 1,581 7.6% 1.4%
008 54 377,593 1 7,098 7,098 1.8% 1.8%
018 24 171,264
022 25 8,884 1 433 433 4.0% 4.8%
035 9 42,043
041 13 112,355

列宽如下(字符数包括空格):3,5,12,6,10,7,10,11,8,7。

解析这个的好方法是什么?我曾尝试使用正则表达式来做到这一点,但它显然在第一行被读入时失败了,因为我使用的表达式期望整行都有数据:

字符串模式 = @"^(?.{3})(?.{5})(?.{12})(?thirtyeightyninenumber>.{6})(?{10})(?.{7 }(?.{10})(?.{11})(?.{8})(?.{7})";

根据该列是否有数据,寻找一种将其读入适当变量的好方法。我觉得我需要抛出一堆 if 检查,但我希望有一个我没有想到的更好的方法。

感谢您的帮助。

顺便说一句 - 我正在使用 StreamReader 和 ReadLine 阅读这些行。

最佳答案

有一个TextFieldParser可用,专门用于读取像这样的固定宽度/分隔文本文件。

它位于 Microsoft.VisualBasic.FileIO 命名空间中,但您仍然可以从 C# 中调用它。

添加对Microsoft.VisualBasic的引用,一个using Microsoft.VisualBasic.FileIO;,那么代码如下所示:

TextFieldParser parser = new TextFieldParser(stream);
parser.TextFieldType = FieldType.FixedWidth;
parser.SetFieldWidths(3, 5, 12, 6, 10, 7, 10, 11, 8, 7);
while (!parser.EndOfData)
{
//Processing row
string[] fields = parser.ReadFields();

// Treat each field appropriately e.g. int.TryParse,
// remove the "%" then float.TryParse etc.
}
parser.Close();

编辑:就是说,在 Reflector 中,如果您缩短的行没有全宽的空格,我认为这会失败。我不确定如何建议你解决这个问题;您可以预处理流以在每行中插入任何缺失的空格吗?

关于c# - 解析固定列宽的可变长度字符串 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12515093/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com