在事务级别处理大型csv文件

时间:2019-04-11 04:40:40

标签: java transactions large-data

我必须使用Java处理如下所示的大型CSV文件(〜1GB)。

Trans1, 1, 2, 3, 4
Trans1, 2, 3, 4, 5
Trans1, 4, 5, 2, 1
Trans2, 1, 2, 3, 4
Trans2, 2, 3, 4, 5
Trans2, 4, 5, 2, 1
Trans2, 1, 2, 3, 4
Trans3, 2, 3, 4, 5
Trans3, 4, 5, 2, 1

前3行属于一个事务,接下来的4行属于一个事务。我必须阅读一批交易,一次可能是1000。当我读取文件时,它应该在该事务的最后一行结束。

使用Java做到最好的最佳方式是什么?

不要将整个文件加载到内存中,以避免任何性能问题。

1 个答案:

答案 0 :(得分:0)

假设您希望将每个事务本身存储在内存中,以在完全阅读之后进行一些处理,则可以尝试以下方法:

StringBuilder sb = new StringBuilder();
int trans = -1;

try (BufferedReader br = Files.newBufferedReader(Paths.get("transactions.csv"))) {
    String line;
    while ((line = br.readLine()) != null) {
        String[] parts = line.split(",\\s*");
        int transCurr = Integer.parseInt(parts[0].replace("Trans", ""));
        if (transCurr != trans && trans != -1) {
            // process the transaction just read in
            sb = new StringBuilder();
        }
        trans = transCurr;
        sb.append(line).append("\n");
    }

}
catch (IOException e) {
    System.err.format("IOException: %s%n", e);
}

如果您想对每行进行处理,那么我们可以轻松地修改上述代码来实现。每个数据点都可以在parts[]中使用。