Считать данные из 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 + '}';
}
}