我必须使用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做到最好的最佳方式是什么?
不要将整个文件加载到内存中,以避免任何性能问题。
答案 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[]
中使用。