String input; //code this to the input string
String regex; //make this equal to the exception regex
BufferedWriter bw; //make this go to file where output will be stored
String toProcess = input;
boolean continueLoop = true;
while(continueLoop){
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(toProcess);
if(m.find()){
bw.write("<exception>"+toProcess.substring(m.start(),m.end())+"</exception>");
toProcess = toProcess.substring(m.end());
}else{
continueLoop = false;
}
}
3条答案
按热度按时间6ojccjat1#
我会去做一个预处理工作,用xml标记异常。下一步你可以使用
XMLInputformat
处理文件(这只是解决方案的开始,根据您的反馈,我们可能会让事情变得更具体)这个链接提供了一个编写您自己的xmlinputformat的教程,您可以自定义它来查找“异常”特征。本教程的要点是这样一句话:
如果记录跨越inputsplit边界,那么记录读取器将处理这个问题,这样我们就不必担心这个问题。
我会复制粘贴网站的信息,因为它可能会在未来离线,这可能会让人非常沮丧,在未来审查这一点:
输入格式:
记录读取器:注意:读取拆分结束后的逻辑是
readUntilMatch
函数,如果存在打开的标记,则读取超过拆分结尾的内容。我想这才是你真正想要的!最后是可写的:
这看起来是一个非常有用的教程,解决了跨多个拆分的记录问题。让我知道如果你能适应你的问题这个例子。
qgelzfjb2#
类textinputformat和nlineinputformat可能会有所帮助。textinputformat将按行分割文件,因此如果异常以换行符结束(并且其中不包含任何内容),则应该可以这样做。如果异常包含固定行数,则nlineinputformat类应该是您想要的,因为您可以设置要采用的行数。
不幸的是,如果异常中可以包含数量可变的换行符,这将不起作用。
在这种情况下,我建议寻找mahout的xmlinputformat。它跨越了分裂的界限,所以对大多数东西都有效。只需运行一个预处理器,将异常放入
<exception></exception>
标记,并将其指定为开始/结束标记。示例预处理器,使用regex识别异常
b0zn9rqh3#
谢谢你的解决方案。我认为这对我很有用
特别注意上面的评论
“如果记录跨越inputsplit边界,则记录读取器将处理此问题,因此我们不必担心此问题。”
然后我研究了linerecordreader如何读取数据表单的源代码。然后我发现实际上linerecordreader已经有了一些逻辑来读取inputsplit边界上的记录,因为由于块的大小限制,分割底部的行记录总是被分割成两个不同的分割。因此,我认为我需要做的是添加linerecordreader读取的数据大小。
现在我的解决方案是:重写linerecordreader中的方法“nextkeyvalue()”。
将行“while(pos<end)”更改为“while(pos<end+{param})”
{param}表示readrecorder跨越分割边界读取的冗余数据的大小。