【问题标题】:Reading a column from CSV file using JAVA [duplicate]使用JAVA从CSV文件中读取一列[重复]
【发布时间】:2013-11-24 18:20:46
【问题描述】:

您好,我正在尝试在 JAVA 中读取名为 test.csv 的 CSV 文件。 下面是我的代码:

import java.io.BufferedReader;
import java.io.FileReader;

public class InsertValuesIntoTestDb {

    @SuppressWarnings("rawtypes")
    public static void main(String[] args) throws Exception {
                String splitBy = ",";
        BufferedReader br = new BufferedReader(new FileReader("test.csv"));
        String line = br.readLine();
        while(line!=null){
             String[] b = line.split(splitBy);
             System.out.println(b[0]);
        }
        br.close();

  }
}

这是我的 CSV 文件 (test.csv):

a,f,w,b,numinst,af,ub
1RW,800,64,22,1,48:2,true
1RW,800,16,39,1,48:2,true
1RW,800,640,330,1,48:2,true
1RW,800,40,124,1,48:2,true
1RW,800,32,104,1,48:2,true
1RW,800,8,104,1,48:2,true
1R1W,800,65536,39,1,96:96,true
1R1W,800,2048,39,1,96:96,true
1R1W,800,8192,39,1,48:48,true

我正在尝试打印 csv 中的第一列,但我得到的输出只有 a 在无限循环中。谁能帮我修复此代码以打印整个第一列。谢谢。

【问题讨论】:

  • 你不会在循环中重新分配line,所以代码循环直到行是null,这永远不会发生。
  • 只是一个注释,希望能帮助您度过我们中的一些人所经历的一些痛苦和折磨。不要为 csv 编写自定义解析器和编写器...当然看起来很简单,每一行都是一行,每个逗号是一列。这是真的,直到它不是!看看opencsv.sourceforge.net 或其他图书馆之一。它将消除维护正确 csv 格式的痛苦。
  • 记录是Java,不是JAVA。

标签: java csv


【解决方案1】:

在循环内连续读取输入,以便为变量line分配初始值以外的值

while ((line = br.readLine()) !=null) {
  ...
}

顺便说一句:这个问题已经使用 CSV 库(例如 OpenCSV)解决了。以下是reading and writing CSV 文件的示例

【讨论】:

  • 如果我想读一整行怎么办?我该怎么做?
  • 这样就可以了。该行被读入变量line...
【解决方案2】:

如果您使用Java 7+,您可能需要使用NIO.2,例如:

代码:

public static void main(String[] args) throws Exception {

    File file = new File("test.csv");

    List<String> lines = Files.readAllLines(file.toPath(), 
            StandardCharsets.UTF_8);

    for (String line : lines) {
        String[] array = line.split(",", -1);
        System.out.println(array[0]);
    }

}

输出:

a
1RW
1RW
1RW
1RW
1RW
1RW
1R1W
1R1W
1R1W

【讨论】:

  • List&lt;String&gt; lines = Files.readAllLines() 好一个+1
  • 当列包含逗号时这不起作用
  • @cricket_007 为什么会这样?他正在用逗号分隔
  • @Sha 如果您不了解仅以任何随机逗号分割不是解决方案,那么您显然从未使用过包含单个列中的数据列表的 CSV。我知道问题本身只要求第一列,并且给出的示例数据本身没有额外的逗号。然而,人们来这里是为了“用 Java 解析 CSV”,这个答案是有缺陷的
  • @cricket_007 哦,你在谈论一列中的逗号分隔值吗? ,那我就误会了
【解决方案3】:

例如,如果您有像

这样的 csv 文件,用逗号分割并不总是有效
"Name" , "Job" , "Address"
"Pratiyush, Singh" , "Teacher" , "Berlin, Germany"

所以,我建议使用Apache Commons CSV API:

    Reader in = new FileReader("input1.csv");
    Iterable<CSVRecord> records = CSVFormat.EXCEL.parse(in);
    for (CSVRecord record : records) {
      System.out.println(record.get(0));
    }

【讨论】:

  • 这应该是公认的答案
【解决方案4】:

您没有更改 line 的值。应该是这样的。

import java.io.BufferedReader;
import java.io.FileReader;

public class InsertValuesIntoTestDb {

  @SuppressWarnings("rawtypes")
  public static void main(String[] args) throws Exception {
      String splitBy = ",";
      BufferedReader br = new BufferedReader(new FileReader("test.csv"));
      while((line = br.readLine()) != null){
           String[] b = line.split(splitBy);
           System.out.println(b[0]);
      }
      br.close();

  }
}

readLine 返回每一行,只有在没有任何内容时才返回 null。上面的代码设置行,然后检查它是否为空。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2016-02-22
    • 2013-04-03
    • 2013-01-21
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多