在C#中以块的形式读取整个文件

4

我有一份银行文件,它的结构非常特殊。其中包括账户号码(25),账户余额起始位置(60F),账户余额终止位置(62F)和交易记录(61表示交易,86表示交易详情)。

:20:STARTSUM
:25:/PL2321109943011
:28C:0330/001
:60F:C100PLN38,74
:62F:C103PLN38,74
-


:20:STARTSUM
:25:/PL24160011982002123456001
:28C:0403/001
:60F:C030403PLN36000,00
:61:0304030403CN100,00S723NONREF//CENT30403H000200
:86:723>00PRZELEW OTRZYMANY ELIXIR>20Fakt VAT 1 nr 00911/03
:86:723>3010501445>3125-00001201467436
:86:723>32Firma XXXXXXXXXXă>33Krakow
:61: 0304030403DN1000,00S223NONREF//CENT30403H002342
:86:223>00PRZEL KRAJ MULTICASH>20000004020 20021224 Fa. 0095
:86:223>21007203-FIRMA SP. Z O>308510101010>311234567890123456
:86:223>32FRIMA XXXXXXXXXX UL. GNI>33EZNIENSKA 1
:86:223>3885101010101234567890123456
:86:223>6085101010101234567890123456
:61:0304030403CN100,00S723NONREF//CENT30403H000230
:86:723>00PRZELEW OTRZYMANY ELIXIR>20Fakt VAT 1 nr 00911/03
:86:723>308510101010>311234567890123456
:86:723>32Firma XXXXXXXXXXă>33Krakow
:86:223>3885101010101234567890123456
:86:223>6085101010101234567890123456
:62F:C030403PLN35200,00
-


:20:STARTSUM
:25:/PL2321109944011
:28C:0330/001
:60F:C120330PLN43,45
:62F:C120330PLN43,45
-


:20:STARTSUM
:25:/PL1109945011
:28C:0330/001
:60F:C1230PLN3,50
:62F:C1230PLN3,50
-

每个块之间始终有两行间隔。我想将这些块放入我创建的对象中。

string[] test = File.ReadAllLines(file);
foreach (var s in test) {

}

我应该如何正确地处理它呢?通常我会通过foreach逐行遍历并尝试通过两个空行来拆分块,然后再通过多个if/else语句进行进一步处理。但也许有更简单/更好的方法吗?


一些关于这个问题的回答会让你接近答案。 - Dan Fitch
你可能想看一下这篇文章:https://dev59.com/klbUa4cB1Zd3GeqPCNTF - Darryl Braaten
啊啊啊,我就是喜欢这些传统格式。 如果行没有分隔符,而是在某个任意编码中包含固定宽度的字段,那就更好了…… - AKX
2个回答

6
string[] blocks = (file.ReadAllText(file)).split(new string[] {"\n\n\n"}, StringSplitOptions.None)

你可以将其分成块以便处理。

哦,非常好!然后你只需要 blocks.Select(b->b.Split("\n") 就可以将块作为字符串数组获取。 - zmbq
我喜欢这种方法,前提是文件不像Tudor所说的那样巨大。如果文件较小,则使用此方法(稍后重新拆分为行)。如果很大,请使用Tudor的方法。 - Kevin Anderson
不应该很大。50个账户,每天几笔交易。 - MadBoy
唯一的问题是Split函数只接受字符而不是字符串。 - MadBoy
抱歉,我无法立即记住重载的确切细节。已修复并提供了我正在使用的重载源代码。http://msdn.microsoft.com/en-us/library/tabh47cf.aspx - ClassicThunder
1
@MadBoy:你可以尝试使用接受字符串数组的重载方法:string[] blocks = (file.ReadAllText(file)).split(new string[] {"\n\n\n"}, StringSplitOptions.None); - Tudor

0

看看使用StreamReader,并运用你的逻辑找到你要寻找的内容。

StreamReader _sr = new StreamReader("YourFile");
_sr.ReadLine();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接