如何在Java中解析一个与此类似的结构
\\Header (name)\\\ 1JohnRide 2MarySwanson 1 password1 2 password2 \\\1 block of data name\\\ 1.ABCD 2.FEGH 3.ZEY \\\2-nd block of data name\\\ 1. 123232aDDF dkfjd ksksd 2. dfdfsf dkfjd .... etc
假设它来自文本缓冲区(普通文件)。
每行文字都是“\ n” - 有限。单词之间使用空格。
结构或多或少地定义。但是,有时可能是犯罪行为 每行信息中的字段数可能不同,有时可能不同 是一些数据块,每个块中的行数也可能不同。
问题是如何最有效地做到这一点?
我头脑中的第一个解决方案是使用正则表达式。
但还有其他解决方案吗?问题导向?也许已经编写了一些java库?
答案 0 :(得分:2)
由于没有人推荐任何图书馆,我的建议是:使用REGEX。
答案 1 :(得分:1)
查看犹他州:https://github.com/sonalake/utah-parser
这是一款非常擅长解析这种半结构化文本的工具
答案 2 :(得分:0)
如果字段是固定长度,您可以使用DataInputStream
来读取文件。或者,由于您的格式是基于行的,您可以使用BufferedReader
来读取行并自己编写一个状态机,它知道接下来会看到什么类型的行,给定它已经看到的行。将每一行作为字符串后,您只需要适当地拆分数据。
例如,密码可以从您的密码行获取,如下所示:
final int pos = line.indexOf(' ');
String passwd = line.substring(pos+1, line.length());
答案 3 :(得分:0)
根据您发布的内容,看起来数据是由空格分隔的。一个想法是使用Scanner
或StringTokenizer
一次获取一个令牌。然后,您可以检查令牌的第一个char
以查看它是否为数字(在这种情况下,数字之后的令牌部分将是数据,如果有的话)。
答案 4 :(得分:0)
这听起来像是一个家庭作业问题所以我会尝试以这样的方式回答它,以帮助指导你(不给出最终解决方案)。
首先,您需要考虑您正在阅读的每个数据对象。它是一个数字然后是文本字段吗?一个数字然后3个文本字段?可变数字和文本字段?
之后,您需要确定要用于分隔每个字段和每个对象的内容。例如,在许多文件中,您会看到字段之间的分号和对象末尾的新行。从你说的话来看,你的声音与众不同。
如果一个物体可以穿过多条线,你需要牢记这一点(不要在物体的中途停止)。
希望这会有所帮助。如果你研究这个并且你仍然遇到问题,那么你到目前为止已经发布了一些代码和一些样本数据,我会帮你解决问题(我会教你钓鱼......不给你鱼:-))。