gpt4 book ai didi

Java,如何从大文件中提取一些文本并将其导入到较小的文件中

转载 作者:太空宇宙 更新时间:2023-11-04 07:36:23 26 4
gpt4 key购买 nike

我对 Java 编程比较陌生,正在尝试创建一个可以帮助一些同事的应用程序。

我想要做的背景是,读取一个大文件的内容,最多可能超过 400,000 行,其中包含 XML,但不是有效的 XML 文档,就像日志一样。

我想做的是构建一个应用程序,用户在其中输入唯一的 ID,然后扫描文档以查找它是否存在,如果存在,并且该唯一 ID 通常在生成的 XML 中出现几次,然后我想向后遍历到节点 ID <documentRequestMessage> ,然后将所有内容从该节点复制到其结束节点,并将其放入它自己的文档中。

我知道如何创建新文档,但正在努力找出如何本质上“向后查找”并将所有内容复制到结束标记,非常感谢任何帮助。

编辑

不幸的是,到目前为止我还无法弄清楚如何实现这 3 个建议中的任何一个。

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();

非常感谢任何进一步的帮助,我不是要求别人为我写它,只是一些非常清晰和基本的说明:)请

编辑2

可以找到我尝试读取和提取的文件的副本 here

最佳答案

当您向前阅读文件以查找您的唯一 ID 时,请保留对您遇到的最新 documentRequestMessage 的引用。当您找到唯一 ID 时,您就已经拥有了提取消息所需的引用。

在这种情况下,“引用”可能有多种含义。由于您没有遍历 DOM(因为它不是有效的 XML),您可能只会将 documentRequestMessage 所在的位置存储在文件中。如果您使用的是 FileInputStream(或任何支持 markInputStream),您只需 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 */
}
}
}
}

关于Java,如何从大文件中提取一些文本并将其导入到较小的文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16813377/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com