JAVA Как оздать объекты на основе данных из файла?
У меня есть тестовый документ с набором данных. Мне нужно на основе этих данных создать объекты. 1 объект - 1 строка. То есть первый параметр, к примеру, - Airliner, он соответствует переменной "type" моего класса, далее Airbus A220 - это переменная "name" моего класса, и так далее.
Ответы (1 шт):
Автор решения: Дмитрий
→ Ссылка
Я когда-то очень давно написал простенький парсер на такие случаи и до сих пор им пользуюсь. Из зависимостей джексон и ничего больше (большая часть проектов и так его использует, поскольку, скорее всего, там у же есть спринг веб, так что и добавлять зачастую ничего не приходится). На файлах в первой строке обозначены названия колонок (как и принято в типичных csv). Ну а дальше все довольно просто и выглядит примерно так:
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Parser {
private final ObjectMapper mapper;
private final String delimiter;
public Parser(String delimiter) {
this.mapper = new ObjectMapper();
this.delimiter = delimiter;
}
public <T> List<T> read(String pathFile, Class<T> clazz) {
try (final Scanner scanner = new Scanner(new BufferedInputStream (new FileInputStream(pathFile)))) {
final List<T> valuesList = new ArrayList<>();
final String[] title = scanner.nextLine().split(delimiter);
while (scanner.hasNext()) {
final String[] value = scanner.nextLine().split(delimiter);
final Map<String, Object> values = IntStream.range(0, value.length)
.boxed()
.filter(i -> value[i] != null && !value[i].trim().isEmpty())
.collect(Collectors.toMap(k -> title[k], v -> value[v]));
valuesList.add(mapper.convertValue(values, clazz));
}
return valuesList;
}
catch(IOException e){
throw new RuntimeException(e);
}
}
}
@lombok.Data
class Aviation{
private String type;
private String name;
private Double speed;
private String serialNumber;
private String country;
private Double index;
private Boolean inStock;
public static void main(String[] args) {
Parser parser = new Parser(", ");
List<Aviation> result = parser.read("my_file.txt", Aviation.class);
}
}
/*
type, name, speed, serialNumber, country, index, inStock
Fighter Aicraft, MIG-15, 1010.0, KE3EA32K, USA, 10.0, true
*/
В вашем случае строки не одинакового содержания: в некоторых есть строка, а в некоторых нет, так что придется доработать либо разделить на 2 файла, но идея примерно такая...