【发布时间】:2017-09-28 15:19:24
【问题描述】:
我正在寻找一种在将 CSV 数据转储到 Java 流之前(或同时)对其进行预处理的有效方法。
在正常情况下我会做这样的事情来处理文件:
File input = new File("helloworld.csv");
InputStream is = new FileInputStream(input);
BufferedReader br = new BufferedReader(new InputStreamReader(is));
br.lines().parallel().forEach(line -> {
System.out.println(line);
});
但是,在目前的情况下,我需要在流式传输记录之前或期间对记录进行预处理,并且我的集合中的每个项目都可能依赖于前一个。下面是一个简单的示例 CSV 文件来演示该问题:
species, breed, name
dog, lab, molly
, greyhound, stella
, beagle, stanley
cat, siamese, toby
, persian, fluffy
在我的示例 CSV 中,物种列仅在从记录更改为记录时才会填充。我知道简单的答案是修复我的 CSV 输出,但在这种情况下这是不可能的。
我正在寻找一种合理有效的方法来处理来自 CSV 的记录,如果为空白,则从先前记录中复制物种值,然后在预处理后传递到并行流。
下游处理可能需要很长时间,所以一旦预处理完成,我最终需要并行处理。我的 CSV 文件也可能很大,所以我想避免先将整个文件加载到内存中的对象中。
我希望有某种方法可以执行以下操作(警告错误的伪代码):
parallelStream.startProcessing
while read line {
if (line.doesntHaveSpecies) {
line.setSpecies
}
parallelStream.add(line)
}
我目前的解决方案是处理整个文件并“修复它”然后流式传输。由于文件可能很大,因此最好在“修复”记录之后和处理整个文件之前立即开始处理记录。
【问题讨论】:
标签: java csv java-8 java-stream