Вопрос-ответ

Can you recommend a Java library for reading (and possibly writing) CSV files? [closed]

Можете ли вы порекомендовать библиотеку 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-файла и т.д.), А разделитель и символ кавычек настраиваются с помощью настроек (из которых существует ряд предопределенных конфигураций, которые удовлетворяют большинству вариантов использования).

Приведенный ниже код говорит сам за себя.


  1. Создайте программу чтения (с вашими Reader и предпочтениями)


  2. (Необязательно) прочитайте заголовок


  3. Настройте сопоставление компонентов


  4. Продолжайте вызывать read(), пока не получите null (конец файла)


  5. Закройте программу чтения


Код:

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");

Кроме того, она поддерживает преобразование основных данных, даты и формата и многое другое. Дайте мне знать, что вы думаете!

С наилучшими пожеланиями!

2023-09-28 10:31 java