JAVA Как оздать объекты на основе данных из файла?

image У меня есть тестовый документ с набором данных. Мне нужно на основе этих данных создать объекты. 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 файла, но идея примерно такая...

→ Ссылка