Text parsing 将可变长度输入文件解析为对象-建议?

Text parsing 将可变长度输入文件解析为对象-建议?,text-parsing,Text Parsing,我的任务是编写一个小型ATM程序。程序收到输入文件后,运行该文件,执行指令 输入文件的格式如下: 8000 1234567812341234 500 100 B W 100 8765432143214321 100 0 W 10 第一行是ATM机中持有的现金总额,后面是一个空行。剩余的输入表示零个或多个用户会话。每届会议包括: 用户的帐号、正确的PIN和他们实际输入的PIN。它们之间用空格隔开。 然后,在一个新的行上,客户的当前余额和透支设施。 然后,一个或多个事务,每个事务位于单独的行上。

我的任务是编写一个小型ATM程序。程序收到输入文件后,运行该文件,执行指令

输入文件的格式如下:

8000

1234567812341234
500 100
B
W 100

8765432143214321
100 0
W 10

第一行是ATM机中持有的现金总额,后面是一个空行。剩余的输入表示零个或多个用户会话。每届会议包括: 用户的帐号、正确的PIN和他们实际输入的PIN。它们之间用空格隔开。 然后,在一个新的行上,客户的当前余额和透支设施。 然后,一个或多个事务,每个事务位于单独的行上。这些可以是以下类型之一: 余额查询,由操作代码B表示。 现金提取,由操作代码W和金额表示。 空行表示用户会话的结束

我能够编写程序中执行事务和输出结果的部分

我需要的帮助是以有意义的方式解析输入文件(可能是对象)。我有问题的事实,输入是可变长度,使循环非常困难

有人能把我推向正确的方向吗?我不仅仅是懒散地寻找答案。我只需要轻轻推一下。这件事我已经坚持了半天了


非常感谢。

您可以使用正则表达式解析每一行,看起来您可以安全地唯一地匹配每一行

12345678 1234 1234 = ^(\d+)\s(\d+)\s(\d+)$ 
500 100            = ^(\d+)\s(\d+)$
B                  = ^B$ 
W 100              = ^W\s(\d+)
因为第一行是已知的,所以只需手动将其转换为整数即可

然后逐行遍历文件,在每个空行上开始尝试用每个正则表达式解析下一行,直到找到匹配项。使用正则表达式组
()
提取相关数据。相应地处理它们。当您得到一个空行时,重置所有内容并再次开始使用正则表达式进行解析

阅读事件驱动的应用程序,这就是问题所在,显然,读取文件时的
循环是一种误导


空行表示逻辑事件集的开始。然后,每一行表示一个原子事件,该事件应该很容易映射到函数/方法调用。

您可以使用正则表达式来解析每一行,看起来您可以安全地唯一地匹配每一行

12345678 1234 1234 = ^(\d+)\s(\d+)\s(\d+)$ 
500 100            = ^(\d+)\s(\d+)$
B                  = ^B$ 
W 100              = ^W\s(\d+)
因为第一行是已知的,所以只需手动将其转换为整数即可

然后逐行遍历文件,在每个空行上开始尝试用每个正则表达式解析下一行,直到找到匹配项。使用正则表达式组
()
提取相关数据。相应地处理它们。当您得到一个空行时,重置所有内容并再次开始使用正则表达式进行解析

阅读事件驱动的应用程序,这就是问题所在,显然,读取文件时的
循环是一种误导


空行表示逻辑事件集的开始。然后,每一行代表一个原子事件,它应该很容易映射到函数/方法调用。

非常感谢您的快速响应。我使用了你建议的一个变体,它起了作用。我使用了基于行计数器的switch语句。第0行:科目编号;别针;别针。第1行:平衡;透支默认值:A事务。如果第一个字符是W,则撤消。B、 平衡。否则,交易结束。嗨,你能解决你面临的问题吗?如果可能的话,你能为这个问题提供你的示例代码…我正在尝试一个类似的…非常感谢你的快速响应。我使用了你建议的一个变体,它起了作用。我使用了基于行计数器的switch语句。第0行:科目编号;别针;别针。第1行:平衡;透支默认值:A事务。如果第一个字符是W,则撤消。B、 平衡。否则,交易结束。嗨,你能解决你面临的问题吗?如果可能的话,你能为这个问题提供你的示例代码…我正在尝试一个类似的。。。