Подтвердить что ты не робот

API Java для создания объекта из файла CSV

В идеале я ищу библиотеку, которая позволяет мне отображать содержимое .csv в объект.

Что-то вроде:

public class Person {

    private String name;
    private int age;

    @CsvField("name")
    public String getName() {
        return this.name;
    }

    @CsvField("age")
    public int getAge() {
        return this.age;
    }
}

а затем скажите что-то вроде:

final Person filledWithDataFromCsv = csvApi.load(csvFilepath, Person.class);

из данного CSV:

#name, age
tom, 11
jim, 32

Кто-нибудь знает об этом API, или о том, что делает что-то подобное. Я не хочу, чтобы он использовал аннотации как обязательные, я просто хочу иметь возможность загружать файл с одной строкой кода и предопределенным классом.

Спасибо,

4b9b3361

Ответ 1

JSefa позволяет вам аннотировать классы Java, которые могут использоваться в процессе сериализации и де-сериализации. tutorial демонстрирует, как это работает с классом CsvIOFactory.

(Из учебника) Аннотирование bean так же просто, как указание местоположения элементов в списке значений, и при необходимости вам нужно указать формат преобразования:

@CsvDataType()
public class Person {
    @CsvField(pos = 1)
    String name;

    @CsvField(pos = 2, format = "dd.MM.yyyy")
    Date   birthDate;
}

Ответ 2

Вы не ошибетесь в uniVocity-parsers. Он поддерживает всевозможные мощные операции и намного быстрее, чем любой другой парсер CSV для Java.

Здесь класс с некоторыми примерами:

class TestBean {

    // if the value parsed in the quantity column is "?" or "-", it will be replaced by null.
    @NullString(nulls = { "?", "-" })
    // if a value resolves to null, it will be converted to the String "0".
    @Parsed(defaultNullRead = "0")
    private Integer quantity;   // The attribute type defines which conversion will be executed when processing the value.

    @Trim
    @LowerCase
    // the value for the comments attribute is in the column at index 4 (0 is the first column, so this means fifth column in the file)
    @Parsed(index = 4)
    private String comments;

    // you can also explicitly give the name of a column in the file.
    @Parsed(field = "amount")
    private BigDecimal amount;

    @Trim
    @LowerCase
    // values "no", "n" and "null" will be converted to false; values "yes" and "y" will be converted to true
    @BooleanString(falseStrings = { "no", "n", "null" }, trueStrings = { "yes", "y" })
    @Parsed
    private Boolean pending;
}

Здесь, как получить список TestBean

BeanListProcessor<TestBean> rowProcessor = new BeanListProcessor<TestBean>(TestBean.class);

CsvParserSettings parserSettings = new CsvParserSettings();
parserSettings.setRowProcessor(rowProcessor);
parserSettings.setHeaderExtractionEnabled(true);

CsvParser parser = new CsvParser(parserSettings);
parser.parse(getReader("/examples/bean_test.csv"));

List<TestBean> beans = rowProcessor.getBeans();

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

Ответ 3

Я предпочитаю opencsv, он очень прост и очень чист.

http://opencsv.sourceforge.net/

Например, чтение:

CSVReader reader = new CSVReader(new FileReader("yourfile.csv"));
String [] nextLine;
while ((nextLine = reader.readNext()) != null) {
    // nextLine[] is an array of values from the line
    System.out.println(nextLine[0] + nextLine[1] + "etc...");
}

Ответ 4

Есть довольно хорошие реализации JDBC для CSV. Таким образом, вы можете использовать такой драйвер, настроить источник данных для его использования, а затем использовать JPA (или что-то еще) для объектно-реляционного сопоставления поверх этого источника данных.

Ответ 5

последняя версия https://github.com/arnaudroger/SimpleFlatMapper 0.9.4 теперь имеет CsvMapper. Он использует заголовок для сопоставления с именем свойства, или если ни один заголовок не может указывать имя столбца через построитель. Он поддерживает конструктор, сеттер и инъекцию поля. Читайте из InputStream или Reader. Также прямо сейчас это не будет управлять отображением имени #name. есть ли причина, по которой есть # в начале csv?

public class MyParser {
    private final CsvMapper<MyObject> mapper = 
           CsvMapperFactory.newInstance().newMapper(MyObject.class);
    public void writeAllObjectToLambda(Writer writer, InputStream is) throws IOException {
        mapper.forEach(is, (o) -> writer.append(o.toString()).append("\n"));
    }
}