Чтение столбца из файла CSV с использованием JAVA

Привет, Я пытаюсь прочитать файл CSV под названием test.csv в JAVA. Ниже мой код:
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 в бесконечном цикле. Может кто-нибудь, пожалуйста, помогите мне исправить этот код, чтобы напечатать весь первый столбец. Спасибо.

Ответы

Ответ 1

Прочитайте ввод непрерывно в цикле, чтобы переменной line присвоено значение, отличное от начального значения

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

Кроме того: эта проблема уже решена с использованием библиотек CSV, таких как OpenCSV. Вот примеры для чтения и записи CSV файлов

Ответ 2

Если вы используете Java 7+, вы можете использовать NIO.2, например:

❍ Code:

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(",");
        System.out.println(array[0]);
    }
}

❍ Output:

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

Ответ 3

Разделение по запятой не работает все время, например, если у вас есть файл csv, например

"Name" , "Job" , "Address"
"Pratiyush, Singh" , "Teacher" , "Berlin, Germany"

Итак, я бы рекомендовал использовать API Apache Commons CSV:

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

Ответ 4

Вы не меняете значение строки. Это должно быть что-то вроде этого.

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, когда ничего не осталось. Вышеупомянутый код устанавливает строку и затем проверяет, является ли она нулевым.

Ответ 5

Вы должны поместить этот line = br.readLine(); внутрь цикла while после System.out.println(b[0]);