Java,如何从大文件中提取一些文本并将其导入到较小的文件中
我对Java编程比较陌生,并且正在尝试创建一个可以帮助一些同事的应用程序。Java,如何从大文件中提取一些文本并将其导入到较小的文件中
我想要做的事情的背景是,读取大型文件的内容,最多可能超过400,000行,其中包含XML但不是有效的XML文档,因为它是一种日志。
我所要做的,是建立在用户输入一个唯一的ID的应用程序,这然后扫描文件找到,如果它存在,如果这样做,而且往往是唯一的ID在生产中出现几次XML,那么我想向后遍历节点ID <documentRequestMessage>
,然后将所有节点从该节点复制到其关闭节点,并将其放入自己的文档中。
我知道如何创建新文档,但我正努力找出如何从本质上'查找倒退'并将所有内容复制到结束标记,非常感谢任何帮助。
编辑
不幸的是,我一直无法弄清楚如何迄今实施的任意的三点建议。
该correlationId是前面提到的独特参考。
当前的代码我有,其工作方式和结果输出到控制台,是
String correlationId = correlationID.getText(); BufferedReader bf = new BufferedReader(new FileReader(f));
System.out.println("Looking for " + correlationId);
int lineCount = 0;
String line;
while ((line = bf.readLine()) != null) {
lineCount++;
int indexFound = line.indexOf(correlationId);
if (indexFound > -1) {
System.out.println("Found CorrelationID on line " + "\t" + lineCount + "\t" + line);
}
}
bf.close();
任何进一步的帮助greatfully赞赏,我不要求别人能把它写对我来说,只是一些真明确基本指令:)请
EDIT 2
我试图读取并可以发现提取该文件的副本here
回答:
在您通过文件向前阅读寻找您的唯一ID时,请保留对您遇到的最近的documentRequestMessage
的引用。当您找到唯一的ID时,您将拥有需要提取该消息的参考。
在这种情况下,“参考”可能意味着一些事情。由于您没有遍历DOM(因为它不是有效的XML),所以您可能只需将该位置存储在documentRequestMessage
所在的文件中。如果您使用的是FileInputStream
(或支持mark
的任何InputStream
),则只需mark
/reset
即可存储并返回到消息启动文件的位置。
这是我相信你正在寻找的实现。这让很多基于您链接的日志文件的假设,但它的工作原理示例文件:
private static void processMessages(File file, String correlationId) {
BufferedReader reader = null;
try {
boolean capture = false;
StringBuilder buffer = new StringBuilder();
String lastDRM = null;
String line;
reader = new BufferedReader(new FileReader(file));
while ((line = reader.readLine()) != null) {
String trimmed = line.trim();
// Blank lines are boring
if (trimmed.length() == 0) {
continue;
}
// We only actively look for lines that start with an open
// bracket (after trimming)
if (trimmed.startsWith("[")) {
// Do some house keeping - if we have data in our buffer, we
// should check it to see if we are interested in it
if (buffer.length() > 0) {
String message = buffer.toString();
// Something to note here... at this point you could
// create a legitimate DOM Document from 'message' if
// you wanted to
if (message.contains("documentRequestMessage")) {
// If the message contains 'documentRequestMessage'
// then we save it for later reference
lastDRM = message;
} else if (message.contains(correlationId)) {
// If the message contains the correlationId we are
// after, then print out the last message with the
// documentRequestMessage that we found, or an error
// if we never saw one.
if (lastDRM == null) {
System.out.println(
"No documentRequestMessage found");
} else {
System.out.println(lastDRM);
}
// In either case, we're done here
break;
}
buffer.setLength(0);
capture = false;
}
// Based on the log file, the only interesting messages are
// the ones that are DEBUG
if (trimmed.contains("DEBUG")) {
// Some of the debug messages have the XML declaration
// on the same line, and some the line after, so let's
// figure out which is which...
if (trimmed.endsWith("?>")) {
buffer.append(
trimmed.substring(
trimmed.indexOf("<?")));
buffer.append("\n");
capture = true;
} else if (trimmed.endsWith("Message:")) {
capture = true;
} else {
System.err.println("Can't handle line: " + trimmed);
}
}
} else {
if (capture) {
buffer.append(line).append("\n");
}
}
}
} catch (IOException ex) {
ex.printStackTrace(System.err);
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException ex) {
/* Ignore */
}
}
}
}
回答:
你可以做的是阅读文件的内容,并寻找<documentRequestMessage>
元素。当您找到上述元素之一时,请阅读,直至找到</documentRequestMessage>
并将其存储在列表中,以便列表中的所有documentRequestMessage
都可用。
您可以在最后或在添加到列表中时遍历此列表以找到您要查找的唯一标识。如果您发现它写入XML文件或忽略。
回答:
我假设你的日志是一系列<documentRequestMessage>
的内容。
根本不扫描日志。
阅读日志,并且每次遇到<documentRequestMessage>
标题时,开始将该<documentRequestMessage>
块的内容保存到块区域中。
我不确定您是否必须解析XML,或者您可以将它保存为字符串列表。
当你遇到一个</documentRequestMessage>
预告片,查看是否块的ID,你正在寻找,
的ID相匹配。如果ID匹配,写<documentRequestMessage>
块到输出文件。如果ID不匹配,请清除块区域并读取下一个<documentRequestMessage>
标题。
这样,你的文件阅读中就没有回溯。
以上是 Java,如何从大文件中提取一些文本并将其导入到较小的文件中 的全部内容, 来源链接: utcz.com/qa/257655.html