我有一个文本文件转储,我需要转换为分隔文件。该文件包含一系列“记录”(缺少更好的单词)格式如下:
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
...
现在,使用Java,我正在使用StringBuffer逐行读取此文件,根据一系列if(inputLine.toLowerCase().startsWith("user:"))
逻辑将行解析为单个字段,以将最终分隔行输出到文本文件。
但是,字段Problem
和Resolution
是自由格式,可能是多行的。我正在尝试做一些可以创建两个字符串的内容:在Problem:
之后追加所有行并在Resolution:
结束,并追加从Resolution:
开始到Form:
结束的所有行。
我已经看过this link和this link了,这表明StringBuilder
可能是一种合适的方法......但是,我不太确定如何构建逻辑。
修改 由于我是逐行阅读的,所以我很难绕过如何编码
<pseudocode>
If the line starts with "Problem" extract the charactes after "Problem" else
if the PRIOR line starts with "problem" and the current line doesnt start with "resolution" then append characters in line to prior line
etc.
</pseudocode>
但是,如果有第三行“问题......?我无法想象如何使其发挥作用。”
实现我想要的结果的任何想法或替代方法?
答案 0 :(得分:2)
如果我能正确理解你的问题,那么这些方面应该有效:
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
}
答案 1 :(得分:2)
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
答案 2 :(得分:1)
我在这里会有点大胆并建议使用真正的解析器生成器,例如JavaCC。
在你的问题中你提到只有两个字段是自由形式的,但也许可能有其他字段在未来被添加为自由形式?当添加第三,第四或第n个特殊情况时,对两个要处理的字段进行硬编码会产生很多副作用。
JavaCC将为您生成一个真正的解析器,而不需要在运行时使用任何额外的jar,甚至更好,将允许您考虑您的解析规则,以便将来的特殊情况不会让您感到悲伤。