Строка, разделенная запятой в CSV-файле Java

Кажется, это очень простая проблема, но я застрял на ней. Кто-нибудь может мне помочь и объяснить, где я делаю ошибку? Я прочитал CSV-файл, где у меня есть:

Time,Activ,Switch,A,B,C,D,E
5:58,on,,,,,,
6:00,on 123,,,ab cd,,,
6:02,on - off,1->2,6,ab cd,1,,
6:04,on,,,cd ab,1,,
6:06,off,,,,,,
7:22,on / off,,,,,,
7:30,on / of,3->4,15,,,,
7:34,home on,,,ab cd,,,

Я хотел бы разделить данные в строке только запятыми и сохранить в массивах, которые будут выглядеть так (первая строка опущена):

1---> ["5:58","on", "", "", "", "", "", ""]
2---> ["6:00", "on 123", "", "", "ab cd", "", "", ""]
3---> ["6:02", "on - off", "1->2", "6", "ab cd", "1", "", ""]
6---> ["7:22", "on / off", "3->4", "15", "", "", "", ""]

и так далее... но я получаю массивы с разделенной строкой также пробелом и другими символами

1---> ["5:58","on", "", "", "", "", "", ""]
2---> ["6:00", "on", "123", "", "", "ab", "cd", "", "", ""]
3---> ["6:02", "on", "-", "off", "1->2", "6", "ab", "cd", "1", "", ""]
6---> ["7:22", "on", "/", "off", "3->4", "15", "", "", "", ""]

Вот мой код:

public class Test {
    public static void main(String []args) {

    String fileName = "TestData.csv";
    File file = new File(fileName);

    try{
        Scanner inputStream = new Scanner(file);
        String firstLine = inputStream.next();
            while(inputStream.hasNext()){
                String dataRow = inputStream.next();

                String[] valuesInDataRow = dataRow.split(",",-1);

                for(int i=0;i<valuesInDataRow.length;i++){
                    System.out.println("---> " + valuesInDataRow[i]);
                }

            }
            inputStream.close();
        }
        catch(FileNotFoundException e) {
            e.printStackTrace();
        }

    }
}

Буду очень признателен за любые объяснения:)

3 ответа

Вы должны использовать inputStream.nextLine() вместо inputStream.next()

Попробуйте что-то вроде

 public static void main(String[] args) {
        String fileName = "TestData.csv";
        File file = new File(fileName);

        try{
            Scanner inputStream = new Scanner(file);
            String firstLine = inputStream.nextLine();
            while(inputStream.hasNext()){
                String dataRow = inputStream.nextLine();

                String[] valuesInDataRow = dataRow.split(",",-1);

                for(int i=0;i<valuesInDataRow.length;i++){
                    System.out.println("---> " + valuesInDataRow[i]);
                }

            }
            inputStream.close();
        }
        catch(FileNotFoundException e) {
            e.printStackTrace();
        }
    }

Здесь я использовал Scanner.nextLine() и regx \\s*,\\s* удалить ненужные пробелы.

public class Test {
    public static void main(String []args) {

        String fileName = "TestData.csv";
        File file = new File(fileName);

        try{
            Scanner inputStream = new Scanner(file);
            String firstLine = inputStream.nextLine();
            while(inputStream.hasNext()){
                String dataRow = inputStream.nextLine();

                String[] valuesInDataRow = dataRow.split("\\s*,\\s*", -1);

                for(int i=0;i<valuesInDataRow.length;i++){
                    System.out.println("---> " + valuesInDataRow[i]);
                }

            }
            inputStream.close();
        }
        catch(FileNotFoundException e) {
            e.printStackTrace();
        }

    }
}

И, как дополнительный совет, я думаю, будет хорошей рекомендацией использовать функцию "1. Попробуй для ресурса" в Java 1.7.

https://www.journaldev.com/592/java-try-with-resources

Вместо:

try{
   Scanner inputStream = new Scanner(file);
   ...
   inputStream.close();
}
catch(FileNotFoundException e) {
  ...
}

Всегда лучше использовать:

try(Scanner inputStream = new Scanner(file)) {
...
}
catch (IOException e) {
...
}

Особенно, если файл должен быть большим. Однако работает с Java 1.7.

Другие вопросы по тегам