Можете ли вы порекомендовать библиотеку Java для чтения (и, возможно, записи) CSV-файлов?
Можете ли вы порекомендовать библиотеку Java для чтения, синтаксического анализа, проверки и сопоставления строк в файле значений, разделенных запятыми (CSV), с объектами значений Java (JavaBeans)?
Переведено автоматически
Ответ 1
Мы использовали http://opencsv.sourceforge.net / с большим успехом
Я также наткнулся на другой вопрос с хорошими ссылками: Java lib или приложение для преобразования CSV в XML-файл?
Ответ 2
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]
)
Ниже приведено сопоставление полей для этого примера - в нем используется комбинация этих:
private static final String[] FIELD_MAPPING = new String[] {
"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 в тип данных вашего поля и как их можно объединить в цепочку.
final CellProcessor[] processors = new CellProcessor[] {
new Optional(new ParseInt()), // age
new ParseBool(), // consent
new ParseInt(), // questionNo 1
new Optional(), // answer 1
new ParseInt(), // questionNo 2
new Optional(), // answer 2
new ParseInt(), // questionNo 3
new Optional() // answer 3
};
Чтение
Чтение с помощью Super CSV очень гибко: вы предоставляете свой собственный файл Reader
(так что вы можете читать из файла, пути к классу, zip-файла и т.д.), А разделитель и символ кавычек настраиваются с помощью настроек (из которых существует ряд предопределенных конфигураций, которые удовлетворяют большинству вариантов использования).
Приведенный ниже код говорит сам за себя.
Создайте программу чтения (с вашими
Reader
и предпочтениями)(Необязательно) прочитайте заголовок
Настройте сопоставление компонентов
Продолжайте вызывать
read()
, пока не получитеnull
(конец файла)Закройте программу чтения
Код:
ICsvDozerBeanReader beanReader = null;
try {
beanReader = new CsvDozerBeanReader(new FileReader(CSV_FILENAME),
CsvPreference.STANDARD_PREFERENCE);
beanReader.getHeader(true); // ignore the header
beanReader.configureBeanMapping(SurveyResponse.class, FIELD_MAPPING);
SurveyResponse surveyResponse;
while( (surveyResponse =
beanReader.read(SurveyResponse.class, processors)) != null ) {
System.out.println(
String.format("lineNo=%s, rowNo=%s, surveyResponse=%s",
beanReader.getLineNumber(), beanReader.getRowNumber(),
surveyResponse));
}
} finally {
if( beanReader != null ) {
beanReader.close();
}
}
Вывод:
lineNo=2, rowNo=2, surveyResponse=SurveyResponse [age=18, consentGiven=true, answers=[Answer [questionNo=1, answer=Twelve], Answer [questionNo=2, answer=Albert Einstein], Answer [questionNo=3, answer=Big Bang Theory]]]
lineNo=3, rowNo=3, surveyResponse=SurveyResponse [age=null, consentGiven=true, answers=[Answer [questionNo=1, answer=Thirteen], Answer [questionNo=2, answer=Nikola Tesla], Answer [questionNo=3, answer=Stargate]]]
lineNo=4, rowNo=4, surveyResponse=SurveyResponse [age=42, consentGiven=false, answers=[Answer [questionNo=1, answer=null], Answer [questionNo=2, answer=Carl Sagan], Answer [questionNo=3, answer=Star Wars]]]
Дополнительная информация
Вы можете найти гораздо больше информации на веб-сайте!
Ответ 3
Я могу порекомендовать SuperCSV. Простой в использовании и сделал все, что мне было нужно.
Ответ 4
Привет, у меня есть проект с открытым исходным кодом для этого: JFileHelpers. Я думаю, главное преимущество в том, что он использует аннотации Java, взгляните:
Если у вас есть этот компонент:
@FixedLengthRecord()
public class Customer {
@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
Все, что вам нужно сделать, это:
FileHelperEngine<Customer> engine =
new FileHelperEngine<Customer>(Customer.class);
List<Customer> customers =
new ArrayList<Customer>();
customers = engine.readResource(
"/samples/customers-fixed.txt");
Кроме того, она поддерживает преобразование основных данных, даты и формата и многое другое. Дайте мне знать, что вы думаете!
С наилучшими пожеланиями!