Как прочитать CSV-файл
Короткий ответ
Пусть есть файл users.csv:
name,age,city
Anna,30,Berlin
Oleg,25,Paris
Maria,41,RomeПропустите строку заголовка и разбейте каждую строку по запятой:
void main() throws IOException {
try (var lines = Files.lines(Path.of("users.csv"))) {
lines.skip(1).forEach(line -> {
String[] cells = line.split(",");
IO.println(cells[0] + " lives in " + cells[2]);
});
}
}Результат:
Anna lives in Berlin
Oleg lives in Paris
Maria lives in RomeВ объекты
Превратите каждую строку в запись — с ней удобнее работать дальше:
record User(String name, int age, String city) {
static User fromCsv(String line) {
String[] cells = line.split(",");
return new User(cells[0].strip(), Integer.parseInt(cells[1].strip()), cells[2].strip());
}
}
void main() throws IOException {
List<User> users;
try (var lines = Files.lines(Path.of("users.csv"))) {
users = lines.skip(1).filter(line -> !line.isBlank()).map(User::fromCsv).toList();
}
IO.println(users.stream().mapToInt(User::age).average().orElse(0));
}Результат:
32.0Другой разделитель
Таблицы из Excel в европейских локалях часто разделены точкой с запятой. Второй аргумент -1 сохраняет пустые ячейки в конце строки:
void main() {
String line = "Anna;30;;";
IO.println(line.split(";").length);
IO.println(line.split(";", -1).length);
}Результат:
2
4Частая ошибка
Разбирать по запятой файл, где значения содержат запятые в кавычках. Строка "Smith, John",42 распадается на три части вместо двух:
void main() {
String line = "\"Smith, John\",42";
IO.println(line.split(",").length);
}Результат:
3Для настоящих CSV с кавычками и переводами строк внутри значений используйте библиотеку — например, Apache Commons CSV или OpenCSV.
Функции из этого ответа
- Files.lines() — Читает файл лениво — как поток строк, не загружая его в память целиком.
- String.split() — Разбивает строку на массив частей по разделителю.
- Integer.parseInt() — Превращает строку с целым числом в int.
- record — Объявляет запись — неизменяемый класс для хранения данных с готовыми equals(), hashCode() и toString().