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

Posted

技术标签:

【中文标题】在c#中以块的形式读取整个文件【英文标题】:Read whole file in blocks in c# 【发布时间】:2012-04-17 13:06:23 【问题描述】:

我有一份来自银行的文件,其结构非常特殊。其中有账号(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
-

每个块之间总是有 2 行换行符。我想将这些块放入我创建的对象中。

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


如何以正确的方式处理它?通常我会通过foreach 行并尝试将块拆分为空的 2 行,然后通过执行多个 if/else 语句走得更远。但也许有简单/更好的方法来解决这个问题?

【问题讨论】:

this question 的一些答案会让你接近。 你可能想看看这个帖子***.com/questions/5880401/… 啊,我就是喜欢这些传统格式。当行没有分隔但包含一些任意编码的固定宽度字段时会更好...... 【参考方案1】:
string[] blocks = (file.ReadAllText(file)).split(new string[] "\n\n\n", StringSplitOptions.None)

应该为你把它分成几块。

【讨论】:

哦,非常好!然后你只需blocks.Select(b->b.Split("\n") 并将块作为字符串数组获取。 我喜欢这种方法,假设文件不像 Tudor 所说的那样庞大。如果文件很小,请使用此方法(稍后重新拆分为行)。如果它很大,请使用 Tudor 的。 它不应该很大。 50 个帐户,每天几笔交易。 唯一的问题是 Split 需要 char 而不是字符串 @MadBoy:您可以尝试使用采用字符串数组的重载:string[] blocks = (file.ReadAllText(file)).split(new string[] "\n\n\n", StringSplitOptions.None);【参考方案2】:

看看使用 StreamReader 并使用你的逻辑来找到你正在寻找的东西。

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

【讨论】:

以上是关于在c#中以块的形式读取整个文件的主要内容,如果未能解决你的问题,请参考以下文章

从HttpServiceClient读取一个巨大的结果集并以块的形式显示它们

SAX 与 XmlTextReader - C# 中的 SAX

如何在ios中将数据以块的形式写入磁盘

如何以块的形式写入文件以规避大文件大小的错误?

Python 在 Mac OS 上以块的形式解码 MP3

以块的形式保存位图图像