Разбор данных OpenCSV в иерархическую структуру - PullRequest
1 голос
/ 20 марта 2019

Мне нужен совет по проблеме, с которой я сталкиваюсь при разборе данных CSV в Java.

У меня есть файл CSV с данными в формате ниже

name, gender, address_first_line, address_second_line, city, number 
me, Male, anonymous, random, Auckland, 6545
other, Female, random, anon, Auckland, 6688

Я хочу проанализировать CSV-файл, используя библиотеку openCSV, приведенную ниже в разделе Object Model. Мне известно о разборе одного класса, но при разборе данных, когда участвуют несколько классов, возникают проблемы. Пожалуйста, предложите, если есть какая-либо другая библиотека, которая может помочь мне получить желаемый результат.

Class User {
    String name;
    String gender;
    Address address;
    long number;
}

Class Address {
   String firstLine;
   String secondLine;
}

1 Ответ

1 голос
/ 21 марта 2019

парсеры univocity имеет аннотацию @Nested, которую вы можете использовать:

Попробуйте:

public static class User {
    @Parsed
    String name;
    @Parsed
    String gender;
    @Nested
    Address address;
    @Parsed
    long number;

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                ", address=" + address +
                ", number=" + number +
                '}';
    }
}

public static  class Address {
    @Parsed(field = "address_first_line")
    String firstLine;
    @Parsed(field = "address_second_line")
    String secondLine;

    @Override
    public String toString() {
        return "Address{" +
                "firstLine='" + firstLine + '\'' +
                ", secondLine='" + secondLine + '\'' +
                '}';
    }
}

public static void main(String ... args){
    StringReader input = new StringReader(
            "name,gender,address_first_line,address_second_line, city,number\n" +
            "John,M,Somewhere,Else,City,1");


    for(User user : new CsvRoutines().iterate(User.class, input)){
        System.out.println(user.toString());
    }

}

Вывод:

User{name='John', gender='M', address=Address{firstLine='Somewhere', secondLine='Else'}, number=1}

Если вам не нравятся аннотации, вы можете сопоставить вещи вручную:

    CsvRoutines routines = new CsvRoutines();
    ColumnMapper mapper = routines.getColumnMapper();

    mapper.attributeToColumnName("name", "name");
    mapper.attributeToColumnName("gender", "gender");
    mapper.attributeToColumnName("number", "number");
    mapper.attributeToColumnName("address.firstLine", "address_first_line");
    mapper.attributeToColumnName("address.secondLine", "address_second_line");

    for (User user : routines.iterate(User.class, input)) {
        System.out.println(user.toString());
    }

Надеюсь, это поможет.

Отказ от ответственности: я являюсь автором этой библиотеки.Это с открытым исходным кодом и бесплатно (лицензия Apache 2.0)

...