java - 解析具有嵌套结构的纯文本文件

标签 java parsing

我正在尝试将纯文本文件解析为 ObjectsArrayList。问题在于它具有某种嵌套结构。数据如下所示:

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/

相关文章:

java - Android - ViewRootImpl$CalledFromWrongThreadException

java - Univocity Parser - 如何在已解析的 bean 中获取行号

python - 以任何顺序解析python中的参数

java - 德国斯坦福解析器

python - 复杂消息结构解析器的设计

java - 程序的流程是怎样的以及为什么会出现 stackOverFlow 错误

java - 删除文本文件中的多余行

java - 使用antlr解析lua特定函数中的IF语句

java - Tomcat Monitor 应用程序中对 Java 选项的更改是否会在运行时持续存在?

java - Antlr4 - 子句的排序