如何使用 java 在 CSV 文件中重新定义特定列?[已结束]

How can I rea a specific column in a CSV file using java? [closed]

提问人:reem ahmad 提问时间:7/7/2021 最后编辑:reem ahmad 更新时间:7/9/2021 访问量:693

问:


想改进这个问题吗?通过编辑这篇文章来更新问题,使其仅关注一个问题。

2年前关闭。

我有一个 CSV 文件(如图所示),如何使用 java 读取特定列(例如:age)并仅存储其值而没有标题? 我不想使用任何依赖项,例如 OpenCSV 或其他:ArrayList

年龄 数据 数字
111 3434 2343
3444
2232
32332
java csv 文件 数组列表 io

评论

1赞 Boris the Spider 7/7/2021
使用 CSV 解析器。除非这是一个家庭作业练习 - 在这种情况下,你会从实践中学到更多的东西而不是要求 - 只需使用CSV解析器。没有人付钱给你发明方轮。
0赞 markspace 7/7/2021
假设家庭作业:您需要一个 CSV 文件进行输入,并且您需要首先弄清楚如何从 CSV 文件中读取所有列。之后,溶液将更容易合成。
1赞 paulsm4 7/7/2021
你最好的选择是使用图书馆......像 OpenCSV。如果您不想这样做,那么 a) 打开您的文件(例如使用 BufferedReader,b) 一次读取一行,c) 丢弃第一行,d) String.split() on “,”,将该行解析为列,以及 e) 将要保存的列添加到 ArrayList 中。

答:

0赞 Alan Ferreira 7/7/2021 #1

首先检查我们的文件格式,存在很多自定义格式。csv

"String Header";"Numeric Header"
"this is a string value";154566.52
String Header;Numeric Header
this is a string value;154566.52
String Header\tNumeric Header
this is a string value\t154566.52
Files.readAllLines(Path.of("/path/to/your.csv")).stream().skip(1) //skip header
  .map(l -> l.split(";")[0]) // get first column i.e. age
  .collect(Collectors.toList()); // and get it as List
BufferedReader reader = BufferedReader(new FileInputStreamReader("/path/to/your.csv"));
reader.readLine();
valuesArr = new ArrayList();
while(reader.ready()) {
     String line = reader.readLine();
     valuesArr.add(line.split(";")[0]);
}

这两种方式将分别输出结果:

["\"this is a string value\""]
["this is a string value"]
["this is a string value\t154566.52"]

评论

0赞 markspace 7/7/2021
这将适用于给定的输入,但通常不适用于 CSV 文件。可以引用 CSV 条目,在这种情况下,处理方式不同。
0赞 Alan Ferreira 7/7/2021
是的,这是正确的,但对于这种情况,开发人员必须检查 CSV 文件以跳过“ ' 字符
2赞 Julian Kreuzer 7/7/2021 #2

如果您想使用默认格式,这应该可以完成工作,您可以使用“;”作为列分隔符。

public static List<String> readOnlyOneColumn(String pathToCsv,String columnSeparator,int columnIndex)
  throws IOException 
{
return Files.lines(Paths.get(pathToCsv)).skip(1).map(e -> e.split(columnSeparator)).map(columns -> columns[columnIndex]).collect(Collectors.toList());
}
1赞 Hasasn 7/7/2021 #3

它基本上是一个简单、优雅的衬里

Files.readAllLines(Path.of("/path/to/your.csv")).stream().skip(1) //skip header
  .map(l -> l.split(";")[0]) // get first column i.e. age
  .collect(Collectors.toList()); // and get it as List