Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用单行和多行数据解析文件_Java_Parsing_File Io - Fatal编程技术网

Java 使用单行和多行数据解析文件

Java 使用单行和多行数据解析文件,java,parsing,file-io,Java,Parsing,File Io,我有一个文本文件转储,需要将其转换为分隔文件。该文件包含一系列“记录”(缺少更好的单词),格式如下: User: abc123 Date: 7/3/12 Subject: the foo is bar Project: 123456 Problem: foo bar in multiple lines of text Resolution: foo un-barred in multiple lines of text User: abc123 Date: 7/3/12 Subject:

我有一个文本文件转储,需要将其转换为分隔文件。该文件包含一系列“记录”(缺少更好的单词),格式如下:

User: abc123 
Date: 7/3/12
Subject: the foo is bar
Project: 123456
Problem: foo bar in multiple lines of text
Resolution: foo un-barred in multiple lines of text

User: abc123 
Date: 7/3/12
Subject: the foo is bar
Project: 234567
Problem: foo bar in multiple lines of text
          which may include <newline> and 
          extend to multiple lines of text
Resolution: foo un-barred in multiple lines of text

...
但是,如果有第三行“问题…?我只是无法想象如何使它工作


有什么想法或替代方法可以达到我想要的结果吗?

嗨,如果我正确理解了你的问题,那么沿着这些思路做的事情应该是可行的:

    StringBuilder problemDesc = new String....;
    if(inputLine.toLowerCase().startsWith("problem:")){
       problemDesc.append(inputLine);
       while(!inputLine.toLowerCase().startsWith("resolution:"){
           //read next line into inputline;
           problemDesc.append(inputline);
       }
       //deal with problem description here and inputLine now has the line with
       //Resolution in it Repeat same logic for retrieving the resolution value
    }

您好,如果我正确理解您的问题,那么以下几点应该可以:

    StringBuilder problemDesc = new String....;
    if(inputLine.toLowerCase().startsWith("problem:")){
       problemDesc.append(inputLine);
       while(!inputLine.toLowerCase().startsWith("resolution:"){
           //read next line into inputline;
           problemDesc.append(inputline);
       }
       //deal with problem description here and inputLine now has the line with
       //Resolution in it Repeat same logic for retrieving the resolution value
    }

我将在这里大胆一点,建议使用真正的解析器生成器,例如

您在问题中提到,只有两个字段是自由形式的,但将来可能会有其他字段作为自由形式添加?当添加第三个、第四个或第N个特殊情况时,硬编码两个要不同处理的字段可能会产生很多副作用


JavaCC将在运行时为您生成一个真正的解析器,而不需要任何额外的JAR,而且更好的是,它将允许您考虑您的解析规则,以便将来的特殊情况不会给您带来任何麻烦。

我将在这里大胆一点,建议使用真正的解析器生成器,例如

您在问题中提到,只有两个字段是自由形式的,但将来可能会有其他字段作为自由形式添加?当添加第三个、第四个或第N个特殊情况时,硬编码两个要不同处理的字段可能会产生很多副作用


JavaCC将在运行时为您生成一个真正的解析器,而不需要任何额外的JAR,甚至更好的是,它将允许您考虑您的解析规则,以便将来的特殊情况不会给您带来任何痛苦。

您提出的逻辑听起来相当可靠。您正在为它的实现而挣扎吗?@nicholas.hauschild I h我不知道如何编码“在不同的行上抓住这两个字符串之间的所有行”,我会澄清这个问题。只要你能假设你的输入格式正确,这个逻辑是正确的。这些行实际上是多行的(使用回车符)或者它们只是单词包装?我相信如果它们只是单词包装,那么它应该将整个语句作为一行来阅读。下面的两个答案中的任何一个都应该起作用。我假设每个组都是一个“记录”,并且给定您的示例,一个记录由两行新行分隔,因此您可能需要在阅读“解析”您提出的逻辑时检查这一点听起来很可靠。你在努力实现它吗?@nicholas.hauschild我不知道如何编写“在不同的行上抓住这两个字符串之间的所有行”,我会澄清这个问题。只要你能假设你的输入格式正确,这个逻辑是正确的。这些行实际上是多行的吗(使用回车)或者它们只是单词包装?我相信如果它们只是单词包装,那么它应该将整个语句作为一行来阅读。下面的两个答案中的任何一个都应该起作用。我假设每个组都是一个“记录”,并且给你的例子一个记录由两行新行分隔,所以你可能需要在阅读“分辨率”时检查一下。哦,这让我很兴奋e、 很多。今天下午还有别的东西要探索。谢谢!哦。这让我很兴奋。很多。今天下午还有别的东西要探索。谢谢!
StringBuilder problem;
StringBuilder resolution;

//...

// If the current line starts with "Problem: "
if(inputLine.toLowerCase().startsWith("Problem: ")) {
   // Continue appending to the string builder until the delimiting line is reached
   while(!inputLine.toLowerCase().startsWith("Resolution") {
      problem.append(inputLine);
   }
}

// Something similar for resolution