Считать данные из CVS файлов каждый раз в новый объект

Подскажите пожалуйста, как считать данные из нескольких CSV файлов, чтобы каждое считывание создавало новый объект, к которому потом можно обратиться и получить значение того или иного поля?

В папке employees у меня находятся csv (и не только, потому фильтруются только csv, начинающиеся на "b") файлы с данными сотрудников по филиалам организации.

У каждого файла четыре столбца. Записи в строках разделены запятыми.

ФИО, Оклад, Сколько лет работает, Попал ли под сокращение

Сейчас в папке четыре файла вида branch1, branch2, branch3, branch4.

Код у меня выглядит так:

public static List<List<String>> getPersonRecords() throws IOException {
    List<List<String>> personRecords = new ArrayList<>();
    try (Stream<Path> paths = Files.walk(Paths.get(".\\employees"))) {

        List<String> list = paths
                .filter(p -> p.getFileName().toString().startsWith("b"))
                .filter(p -> p.getFileName().toString().endsWith(".csv"))
                .map(path -> Files.isDirectory(path) ? path.toString() + '/' : path.toString())
                .collect(Collectors.toList());


        for (int i = 0; i < list.size(); i++) {

            try (BufferedReader br = new BufferedReader(new FileReader(list.get(i)))) {
                String line;
                line = br.readLine();
                while ((line = br.readLine()) != null) {
                    String[] values = line.split(",");
                    personRecords.add(Arrays.asList(values));
                }
            }
        }
        return personRecords;
    }
}

Но сейчас при выводе на печать в консоли personRecords там оказываются все филиалы вместе по порядку, что впрочем видно и при дебаге на return personRecords. И получается, что при этом теряется информация о том, из какого филиала (какой из файлов branch) сотрудник.


Ответы (1 шт):

Автор решения: Дмитрий

У вас слишком много функционала нагружено в один метод. Принцип единственной ответственности никто не отменял. Кроме того , результат в виде List<List> - так себе идея. Как с этим потом работать? Сделайте класс Employee и парсите туда свои данные.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Main {

    public static void main(String[] args) throws IOException {

        List<String> filesList = filesList(".\\employees");
        for (String path : filesList) {
            List<Employee> employees = toEmployees(path);
            System.out.println(employees);//сотрудниуи из одного списка
        }

    }

    public static List<Employee> toEmployees(String path) throws IOException {
        try (Stream<String> br = new BufferedReader(new FileReader(path)).lines()) {
            return br.skip(1)
                    .map(line -> new Employee(line.split(",")))                    
                    .collect(Collectors.toList());
        }

    }

    public static List<String> filesList(String filesPath) throws IOException {
        try (Stream<Path> paths = Files.walk(Paths.get(filesPath))) {
            return paths
                    .filter(p -> p.getFileName().toString().startsWith("b"))
                    .filter(p -> p.getFileName().toString().endsWith(".csv"))
                    .map(path -> Files.isDirectory(path) ? path.toString() + '/' : path.toString())
                    .collect(Collectors.toList());
        }
    }

}

class Employee {

    private final String fullName;
    private final Long salary;
    private final String workExperience;
    private final Boolean wasReduced;

    public Employee(String[] args) {
        this.fullName = args[0];
        this.salary = Long.valueOf(args[1]);
        this.workExperience = args[2];
        this.wasReduced = Boolean.valueOf(args[3]);
    }

    public String getFullName() {
        return fullName;
    }

    public Long getSalary() {
        return salary;
    }

    public String getWorkExperience() {
        return workExperience;
    }

    public Boolean getWasReduced() {
        return wasReduced;
    }

    @Override
    public String toString() {
        return "Employee{" + "fullName=" + fullName + ", salary=" + salary + ", workExperience=" + workExperience + ", wasReduced=" + wasReduced + '}';
    }
    
}
→ Ссылка