Не удается прочитать CSV-файл в массив с помощью сканера

#java #android #android-studio

#java #Android #android-studio

Вопрос:

Я немного новичок в этом, но кто-нибудь знает, почему мой код не может прочитать csv-файл? Вот мой код:

 try {
    Scanner s = new Scanner(new File("/sdcard/test.txt"));
    // s.useDelimiter(";");

    ArrayList<String> list = new ArrayList<String>();
    while (s.hasNextLine()) {
        list.add(s.next());
    }
    for (int i = 0; i < list.size(); i  ) {
        System.out.println(list.get(i));
    }
    s.close();
} catch (FileNotFoundException e) {
    e.printStackTrace();
}
  

Не имеет значения, является ли файл .txt или .csv. Не имеет значения, использую ли я разделитель или нет. Я не получаю никаких ошибок, но и не получаю никаких выходных данных.

Мой файл .csv выглядит следующим образом:

 010000;713150586024;fólie spodní 425;m
010001;9;folie vrch.Pečený bochník;m
010002;9;fólie černá sp.tvrdá 475;m
  

Когда я меняю файл на этот, он работает:

 010000;
010001;
010002;
  

Итак, я думаю, проблема в пробелах между словами? Есть ли какое-то решение для этого?

Комментарии:

1. Что вы имеете в виду it works ? После того, как вы прочитали .csv файл, как он выглядит напечатанным?

2. Извините за неясность. Вывод точно такой же, как он записан в файле .csv. 010000; 010001; 010002; Он состоит из 3 строк. Извините, я не знаю, как писать код в комментариях.

3. Просто запустил код с тем же csv, и он работал с useDelimeter .

4. Как кодируется файл? Я воспроизвел ваши результаты, если файл закодирован как UTF-8, но как ANSI или UNICODE он дал результаты (что может привести к другой проблеме, когда вы смешиваете hasNextLine и next — не уверен, предназначено ли это).

5. Добавление "utf-8" параметра on в сканер ( new Scanner(new File("..."),"utf-8") похоже, устраняет проблему (при условии, что файл закодирован как utf-8).

Ответ №1:

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

Я предлагаю использовать a BufferedReader вместо a Scanner при чтении файлов:

 try (BufferedReader br = new BufferedReader(new FileReader("/sdcard/test.txt"))) {
    String line;
    List<String> list = new LinkedList<>();
    while((line = br.readLine()) != null) {
        list.addAll(Arrays.asList(line.split(";")));
    }
    for (int i = 0; i < list.size(); i  ) {
        System.out.println(list.get(i));
    }
} catch (IOException e) {
    e.printStackTrace();
}
  

Также в этом случае полезно попробовать с ресурсами, поэтому вам не нужно явно вызывать метод close .

Если вам нужен более функциональный код, вы можете использовать потоки Java 8 следующим образом:

 try (BufferedReader br = new BufferedReader(new FileReader("/sdcard/test.txt"))) {
    br.lines()
            .flatMap(line -> Stream.of(line.split(";")))
            .forEach(System.out::println);
} catch (IOException e) {
    e.printStackTrace();
}
  

Вы можете прочитать больше о Streams API здесь .

Ответ №2:

Это была проблема с кодировкой. Я только что добавил это ‘, «windows-1250» ‘ в свой код:

 (new FileInputStream("/sdcard/test.csv"), "windows-1250"));
  

Спасибо всем 🙂