【问题标题】:How can I rea a specific column in a CSV file using java? [closed]如何使用 java 读取 CSV 文件中的特定列? [关闭]
【发布时间】:2021-09-17 12:12:29
【问题描述】:

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

age data numbers
111 3434 2343
3444
2232
32332

【问题讨论】:

  • 使用 CSV 解析器。除非这是一个家庭作业——在这种情况下,你会从实践中学到更多而不是询问——只需使用 CSV 解析器。没有人花钱请你发明方轮。
  • 假设作业:您需要一个 CSV 文件作为输入,并且您需要首先弄清楚如何从 CSV 文件中读取所有列。之后,解决方案将更容易合成。
  • 最好的办法是使用库……比如 OpenCSV。如果您不想这样做,那么 a)打开文件(例如使用BufferedReader,b)一次读取一行,c)丢弃第一行,d)String.split() on "," 将行解析为列,并且 e) 将要保存的列添加到 ArrayList 中。

标签: java csv file arraylist io


【解决方案1】:

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

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());
}

【讨论】:

    【解决方案2】:

    首先检查我们的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"]
    

    【讨论】:

    • 这适用于给定的输入,但一般不适用于 CSV 文件。 CSV 条目可以被引用,在这种情况下处理是不同的。
    • 是的,它是正确的,但是对于这种情况,开发人员必须检查 CSV 文件以跳过 " ' 字符
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-25
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      • 2015-02-01
      • 1970-01-01
      • 2013-05-06
      相关资源
      最近更新 更多