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, или о том, что делает что-то подобное. Я не хочу, чтобы он использовал аннотации как обязательные, я просто хочу иметь возможность загружать файл с одной строкой кода и предопределенным классом.
Спасибо,
Ответы
Ответ 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"));
}
}