gpt4 book ai didi

java - 使用新的 Java 8 Streams API 解析 CSV 文件以获取唯一行

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:04:45 25 4
gpt4 key购买 nike

我正在尝试使用新的 Java 8 Streams API(我完全是新手)来解析 CSV 文件中的特定行(名称列中带有“Neda”的行)。使用以下 article出于动机,我修改并修复了一些错误,以便我可以解析包含 3 列的文件 - “姓名”、“年龄”和“高度”。

name,age,height
Marianne,12,61
Julie,13,73
Neda,14,66
Julia,15,62
Maryam,18,70

解析代码如下:

@Override
public void init() throws Exception {
Map<String, String> params = getParameters().getNamed();
if (params.containsKey("csvfile")) {
Path path = Paths.get(params.get("csvfile"));
if (Files.exists(path)){
// use the new java 8 streams api to read the CSV column headings
Stream<String> lines = Files.lines(path);
List<String> columns = lines
.findFirst()
.map((line) -> Arrays.asList(line.split(",")))
.get();
columns.forEach((l)->System.out.println(l));
// find the relevant sections from the CSV file
// we are only interested in the row with Neda's name
int nameIndex = columns.indexOf("name");
int ageIndex columns.indexOf("age");
int heightIndex = columns.indexOf("height");
// we need to know the index positions of the
// have to re-read the csv file to extract the values
lines = Files.lines(path);
List<List<String>> values = lines
.skip(1)
.map((line) -> Arrays.asList(line.split(",")))
.collect(Collectors.toList());
values.forEach((l)->System.out.println(l));
}
}
}

有没有办法避免在提取标题行后重新读取文件?尽管这是一个非常小的示例文件,但我会将此逻辑应用于一个大型 CSV 文件。

是否有技术使用流 API 在提取的列名称(在文件的第一次扫描中)与其余行中的值之间创建映射?

如何以 List<String> 的形式只返回一行(而不是包含所有行的 List<List<String>>)。我宁愿只找到该行作为列名与其对应值之间的映射。 (有点像 JDBC 中的结果集)。我看到一个 Collectors.mapMerger 函数在这里可能会有帮助,但我不知道如何使用它。

最佳答案

显式使用 BufferedReader:

List<String> columns;
List<List<String>> values;
try(BufferedReader br=Files.newBufferedReader(path)) {
String firstLine=br.readLine();
if(firstLine==null) throw new IOException("empty file");
columns=Arrays.asList(firstLine.split(","));
values = br.lines()
.map(line -> Arrays.asList(line.split(",")))
.collect(Collectors.toList());
}

Files.lines(…) 也求助于 BufferedReader.lines(…)。唯一的区别是 Files.lines 将配置流,以便关闭流将关闭读取器,我们在这里不需要,因为显式 try(…) 语句已经确保 BufferedReader 的关闭。

请注意,在 lines() 返回的流已被处理后,无法保证读取器的状态,但我们可以安全地读取行 执行流操作之前。

关于java - 使用新的 Java 8 Streams API 解析 CSV 文件以获取唯一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34639928/

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