我正在尝试将纯文本文件解析为 Objects
的 ArrayList
。问题在于它具有某种嵌套结构。数据如下所示:
S 183166621 75783-29-8 0 -1 0 0 0 0
SS 183166621 0 DE Siloxane und Silikone, di-Me, polymers mit bor oxid (B2O3)
SS 183166621 0 EN Siloxanes and Silicones, di-Me, polymers with boron oxide (B2O3)
S 183166624 3087-36-3 221-410-8 0 -1 0 0 0 0
SS 183166624 0 DE Titan(4+)ethanolat
SS 183166624 0 EN Ethanol, titanium(4+) salt
所以有一行以“S”开头,代表某种物质。每个“S”行后面跟着多个“SS”行,其中包含不同语言中相应物质的同义词。同义词的数量不固定。有些只有 2 个,有些有 3 个、4 个或更多。
我的想法是创建一个物质对象
,其中包含一个包含所有可能同义词的列表。
我创建了一个 BufferedReader
并尝试逐行解析文件
String line;
while((line = br.readLine()) != null) {
if (line.startsWith("S\t")) {
Substance substance = new Substance();
String[] columns = line.split("\t");
// Parse columns and store them in substance Object
}
}
为了阅读同义词,我想启动第二个内部循环来解析以“SS”开头的所有行。当到达另一个“S”行时,内部循环停止。
String line;
while((line = br.readLine()) != null) {
if (line.startsWith("S\t")) {
Substance substance = new Substance();
String[] columns = line.split("\t");
// Parse columns and store them in substance Object
while((line = br.readLine()) != null) {
if (line.startsWith("SS\t")) {
Synonym synonym = new Synonym();
// Parse columns and store them in synonym Object
// Add synonym to List of Synonyms of Substance
substance.addSynonym(synonym);
}
else {
break;
}
}
}
}
这样做的问题是,在离开内部循环后,外部循环执行另一个 readline()
因此实际的“S”行会丢失。
有人能指出我正确的方向吗?
最佳答案
正如您所认识到的问题是您从阅读器中读取了两次。我只会读一次并立即拆分,检查第一个标记是否是表示主要物质的 S
或表示先前读取的主要物质的同义词的 SS
。为此,您需要在循环之外拥有 Substancesubstance;
变量。
String line;
Substance actualSubstance = null;
while((line = br.readLine()) != null) {
String[] columns = line.split("\t");
if (columns[0].equals("S")) {
actualSubstance = new Substance();
// parse main substance
} else if (columns[0].equals("SS")) {
if(actualSubstance != null) {
Synonym synonym = new Synonym();
// parse synonim substance and add to actual main substance
actualSubstance.addSynonym(synonym);
} else {
// bad format of the input file -> handle accordingly
}
} else {
// junk
}
}
关于java - 解析具有嵌套结构的纯文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27045578/