Можете ли вы порекомендовать библиотеку Java для чтения (и, возможно, записи) CSV-файлов?[закрыто]
Вопрос
Можете ли вы порекомендовать библиотеку Java для чтения, синтаксического анализа, проверки и сопоставления строк в файле значений, разделенных запятыми (CSV), с объектами значений Java (JavaBeans)?
Решение
Мы использовали http://opencsv.sourceforge.net/ с большим успехом
Я также наткнулся на другой вопрос с хорошими ссылками:Java lib или приложение для преобразования CSV в XML-файл?
Другие советы
Супер CSV это отличный выбор для чтения / синтаксического анализа, проверки и сопоставления CSV-файлов с POJOs!
Мы (команда Super CSV) только что выпустили новую версию (вы можете Скачать это из SourceForge или Maven).
Чтение CSV-файла
В следующем примере используется CsvDozerBeanReader
(мы только что выпустили новую программу для чтения, которая использует Бульдозер для отображения компонентов с поддержкой глубокого отображения и отображения на основе индексов) - это основано на примере из нашего Веб-сайт.Если вам не нужна функциональность бульдозера (или вам просто нужна простая автономная зависимость), то вы можете использовать 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-файла будет считана в Ответ на опрос класс, каждый из которых имеет список Ответs.Чтобы сопоставление работало, ваши классы должны быть допустимыми 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 - файла в другие типы данных (напримерДата, Целое число), или для проверки ограничений (напримеробязательный / необязательный, сопоставление регулярных выражений, проверка диапазона).
Использование клеточных процессоров - это полностью необязательный - без них каждый столбец CSV будет строкой, поэтому каждое поле также должно быть строкой.
Ниже приведена конфигурация процессора ячейки для примера.Как и в случае сопоставления полей, каждый элемент массива представляет собой столбец CSV.В нем показано, как процессоры ячеек могут преобразовывать 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]]]
Дополнительная информация
Вы можете найти гораздо больше информации на сайте Веб-сайт!
Я могу порекомендовать СуперКСВ.Простой в использовании и сделал все, что мне было нужно.
Эй, у меня есть проект с открытым исходным кодом для этого: 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");
Кроме того, он поддерживает преобразование основных данных, даты и формата и многое другое.Дай мне знать, что ты думаешь!
С наилучшими пожеланиями!
Я нахожу Плоский Пакет чтобы действительно хорошо справляться со сложными CSV-файлами (экранирование, кавычки, неверные записи и т.д.)
Вопрос о преобразовании CSV-файла в XML, заданный ранее, похоже, отвечает на все мои вопросы.
OpenCSV (http://opencsv.sourceforge.net/) также выполняет привязку к JavaBeans, используя стратегию сопоставления позиций столбцов
ColumnPositionMappingStrategy strat = new ColumnPositionMappingStrategy();
strat.setType(YourOrderBean.class);
String[] columns = new String[] {"name", "orderNumber", "id"}; // the fields to bind do in your JavaBean
strat.setColumnMapping(columns);
CsvToBean csv = new CsvToBean();
List list = csv.parse(strat, yourReader);
JSEFA (http://jsefa.sourceforge.net) также, кажется, делает все, что мне нужно - особенно привязку к объектам Java - в дополнение к поддержке FLR и XML
Видишь CVSBeans