Отображение строки с разделителями в список строк или в новый объект

У меня есть файл с некоторыми данными, разделенными точкой с запятой. Я пытаюсь создать поток, который будет читать файл построчно, отделять каждый столбец данных и сопоставлять его с новым объектом.

данные.txt:

John;Smith;42;shopassistant
Clara;Lefleur;24;programmer

Человек.класс:

public class Person{
   String name;
   String lastName;
   int age;
   String job;
}

Я начал с чего-то вроде этого:

List<Person> people = Files.lines(Paths.get("src/data.txt"))....

Есть идеи?


person steve1337    schedule 24.08.2018    source источник
comment
Возможный дубликат Чтение CSV со сканером()   -  person    schedule 24.08.2018


Ответы (2)


Scanner был бы более полезен для этой работы, а поскольку java-9 с ним гораздо приятнее работать:

Pattern p = Pattern.compile("^(\\w+);(\\w+);(\\w+);(\\w+)$", Pattern.MULTILINE);
List<Person> persons = new Scanner(Paths.get("src/data.txt"))
            .findAll(p)
            .map(mr -> new Person(mr.group(1), mr.group(2), Integer.valueOf(mr.group(3)), mr.group(4)))
            .collect(Collectors.toList());
person Eugene    schedule 25.08.2018
comment
Он больше соответствует стандартам? - person steve1337; 25.08.2018
comment
@ steve1337, что ты имеешь в виду? - person Eugene; 25.08.2018
comment
Какое решение вам было бы приятно увидеть во время, скажем, код-ревью? - person steve1337; 25.08.2018
comment
@ steve1337 очевидно, это. Scanner является инструментом для начала. - person Eugene; 25.08.2018

Вы можете использовать карту следующим образом:

List<Person> people = Files.lines(Paths.get("src/data.txt"))
        .map(p -> p.split(";"))//split each line with ';'
        .map(p -> new Person(p[0], p[1], Integer.valueOf(p[2]), p[3]))//create a new Person
        .collect(Collectors.toList());//then collect the result

Убедитесь, что у вас есть конструктор, который содержит эту информацию:

public Person(String name, String lastName, int age, String job) {
person YCF_L    schedule 24.08.2018
comment
Отличное решение. Я не знал, как ведет себя поток после метода .map, и не обнаружил, что могу использовать его дважды. Спасибо. - person steve1337; 24.08.2018
comment
Пожалуйста, @steve1337, потому что карта возвращает Stream<R>, поэтому вы можете использовать другую карту и так далее. - person YCF_L; 24.08.2018
comment
@Eugene yes Если пользователь использует Java-9+, но мне нравится использовать Files, так как я могу использовать takeWhile, dropWhile и многие другие лучшие инструменты +1 в любом случае - person YCF_L; 25.08.2018
comment
@YCF_L, и, кстати, вам повезло с регулярным выражением с одним символом, иначе это Pattern должно было быть взято за пределы потока как такового ... - person Eugene; 25.08.2018
comment
@Eugene Я тестирую и свой, и твой код. Я обнаружил, что мой код работает быстрее, ты можешь проверить это в своей среде. - person YCF_L; 25.08.2018
comment
@YCF_L протестируйте и мой, и ваш код. Я обнаружил, что мой код более быстрый, извините, но это все равно, что ничего не сказать, правильные тесты и правильное их объяснение намного сложнее, чем я, и вы можете подумать - person Eugene; 25.08.2018