【问题标题】:Parsing a large text file into chunks in Java在 Java 中将大文本文件解析为块
【发布时间】:2013-10-05 11:36:09
【问题描述】:

我想收到一些关于我要用 Java 解决的小问题的建议。

我有一个格式如下的文件:

@
some text
some text
some text

@
some text
some text
some text

@
some text
some text
some text

...等等。

我需要读取该文本文件的下一个块,然后创建一个包含读取块的 InputStream 对象并将 InputStream 对象传递给解析器。我必须对文本文件中的每个块重复这些操作。每个块都写在以@开头的行之间。问题是使用解析器解析@标签之间的每个部分,该解析器应该从 InputStream 读取每个块。

文本文件可能很大,所以我想获得好的性能。

我该如何解决这个问题?

我想过做这样的事情:

    FileReader fileReader = new FileReader(file);

    BufferedReader bufferedReader = new BufferedReader(fileReader);

    Scanner scanner = new Scanner(bufferedReader);

    scanner.useDelimiter("@");

    List<ParsedChunk> parsedChunks = new ArrayList<ParsedChunk>();

    ChunkParser parser = new ChunkParser();

    while(scanner.hasNext())
    {
        String text = scanner.next();

        InputStream inputStream = new ByteArrayInputStream(text.getBytes("UTF-8"));

        ParsedChunk parsedChunk = parser.parse(inputStream);

        parsedChunks.add(parsedChunk);

        inputStream.close();
    }

    scanner.close();

但我不确定这是否是一个好方法。

谢谢。

【问题讨论】:

  • 很难理解文件的格式到底是什么。此外,如果您希望在帖子中使用正确的格式标记。
  • 在开始优化之前,您应该衡量问题所在。在许多系统中,限制事实是读取文件和分割成行所花费的时间。在这种情况下,您可能会尝试加快速度。
  • 投反对票的人是否需要从他们的钱包中支付理由?为什么他们不发表评论?
  • 我已经重写了我的帖子。现在应该更容易理解了。

标签: java file parsing java.util.scanner bufferedreader


【解决方案1】:

如果我理解正确的话。这就是您要实现的目标。仅供参考,您需要 JAVA 7 才能运行以下代码

public static void main(String[] args) throws IOException {
    List<String> allLines = Files.readAllLines(new File("d:/input.txt").toPath(), Charset.defaultCharset());
    List<List<String>> chunks = getChunks(allLines);
    //Now you have all te chunks and you can process them
}

private static List<List<String>> getChunks(List<String> allLines) {
    List<List<String>> result = new ArrayList<List<String>>();
    int i = 0;
    int fromIndex = 1;
    int toIndex = 0;
    for(String line : allLines){
        i++;
        if(line.startsWith("****") && i != 1){ // To skip the first line and the check next delimiter
            toIndex = i-1;          
            result.add(allLines.subList(fromIndex, toIndex));
            fromIndex = i;
        }
    }
    return result;
}

【讨论】:

    【解决方案2】:

    没有完全明白这个问题,但你现在可以尝试使用 char,将所有字符存储在 char 数组中并通过循环和条件语句,每次遇到'@'时都会中断字符串

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多