#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"));
Спасибо всем 🙂