Can you recommend a Java library for reading (and possibly writing) CSV files? [closed]
Можете ли вы порекомендовать библиотеку Java для чтения (и, возможно, записи) CSV-файлов?
Можете ли вы порекомендовать библиотеку Java для чтения, синтаксического анализа, проверки и сопоставления строк в файле значений, разделенных запятыми (CSV), с объектами значений Java (JavaBeans)?
Super CSV - отличный выбор для чтения / синтаксического анализа, проверки и сопоставления CSV-файлов с POJOs!
Мы (команда Super CSV) только что выпустили новую версию (вы можете скачать ее с SourceForge или Maven).
Чтение CSV-файла
В следующем примере используется CsvDozerBeanReader (только что выпущенный нами новый ридер, использующий Dozer для отображения компонентов с поддержкой глубокого отображения и отображения на основе индексов) - он основан на примере с нашего веб-сайта. Если вам не нужна функциональность Dozer (или вы просто хотите простую автономную зависимость), то вы можете использовать CsvBeanReader вместо этого (см. Этот Пример кода).
Пример CSV-файла
Вот пример CSV-файла, представляющего ответы на опрос. В нем есть заголовок и 3 строки данных, все по 8 столбцов.
age,consentGiven,questionNo1,answer1,questionNo2,answer2,questionNo3,answer3 18,Y,1,Twelve,2,Albert Einstein,3,Big Bang Theory ,Y,1,Thirteen,2,Nikola Tesla,3,Stargate 42,N,1,,2,Carl Sagan,3,Star Wars
Определение сопоставления CSV с POJO
Каждая строка CSV будет считана в класс SurveyResponse, каждый из которых содержит список ответов. Для того, чтобы сопоставление работало, ваши классы должны быть допустимыми Javabeans (т. е. Иметь конструктор без аргументов по умолчанию и иметь методы получения / установки, определенные для каждого поля).
В Super CSV вы определяете сопоставление с помощью простого массива строк - каждый элемент массива соответствует столбцу в CSV-файле.
С CsvDozerBeanMapper вы можете использовать:
простые сопоставления полей (например, firstName)
глубокие сопоставления (например, address.country.code)
индексированное отображение (например, middleNames[1] - индекс на основе нуля для массивов или коллекций)
глубокое + индексированное сопоставление (например, person.middleNames[1])
Ниже приведено сопоставление полей для этого примера - в нем используется комбинация этих:
privatestaticfinal String[] FIELD_MAPPING = newString[] { "age", // simple field mapping (like for CsvBeanReader) "consentGiven", // as above "answers[0].questionNo", // indexed (first element) + deep mapping "answers[0].answer", "answers[1].questionNo", // indexed (second element) + deep mapping "answers[1].answer", "answers[2].questionNo", "answers[2].answer" };
Преобразование и проверка
Super CSV имеет полезную библиотеку процессоров ячеек, которые можно использовать для преобразования строк из CSV-файла в другие типы данных (например, дату, целое число) или для проверки ограничений (например, обязательных / необязательных, сопоставления регулярных выражений, проверки диапазона).
Использование процессоров cell полностью необязательно - без них каждый столбец CSV будет строкой, поэтому каждое поле также должно быть строкой.
Ниже приведена конфигурация процессора ячеек для примера. Как и в случае с отображением полей, каждый элемент массива представляет столбец CSV. Это демонстрирует, как процессоры cell могут преобразовывать данные CSV в тип данных вашего поля и как их можно объединить в цепочку.
Чтение с помощью Super CSV очень гибко: вы предоставляете свой собственный файл Reader (так что вы можете читать из файла, пути к классу, zip-файла и т.д.), А разделитель и символ кавычек настраиваются с помощью настроек (из которых существует ряд предопределенных конфигураций, которые удовлетворяют большинству вариантов использования).
Приведенный ниже код говорит сам за себя.
Создайте программу чтения (с вашими Reader и предпочтениями)
(Необязательно) прочитайте заголовок
Настройте сопоставление компонентов
Продолжайте вызывать read(), пока не получите null (конец файла)
Вы можете найти гораздо больше информации на веб-сайте!
Ответ 3
Я могу порекомендовать SuperCSV. Простой в использовании и сделал все, что мне было нужно.
Ответ 4
Привет, у меня есть проект с открытым исходным кодом для этого: JFileHelpers. Я думаю, главное преимущество в том, что он использует аннотации Java, взгляните:
Если у вас есть этот компонент:
@FixedLengthRecord() publicclassCustomer { @FieldFixedLength(4) public Integer custId;
@FieldAlign(alignMode=AlignMode.Right) @FieldFixedLength(20) public String name;
@FieldFixedLength(3) public Integer rating;
@FieldTrim(trimMode=TrimMode.Right) @FieldFixedLength(10) @FieldConverter(converter = ConverterKind.Date, format = "dd-MM-yyyy") public Date addedDate;
@FieldFixedLength(3) @FieldOptional public String stockSimbol; }
И хочет проанализировать этот файл:
....|....1....|....2....|....3....|....4 1 Antonio Pereira 10012-12-1978ABC 2 Felipe Coury 201-01-2007 3 Anderson Polga 4212-11-2007DEF