Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как прочитать 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().

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.