Ответ 1
Мы использовали http://opencsv.sourceforge.net/ с хорошим успехом
Я также столкнулся с другим вопросом с хорошими ссылками: Java lib или приложение для преобразования CSV в файл XML?
Можете ли вы порекомендовать библиотеку Java для чтения, разбора, проверки и сопоставления строк в файле с разделителями-запятыми (CSV) для объектов значений Java (JavaBeans)?
Мы использовали http://opencsv.sourceforge.net/ с хорошим успехом
Я также столкнулся с другим вопросом с хорошими ссылками: Java lib или приложение для преобразования CSV в файл XML?
Super CSV - отличный выбор для чтения/разбора, проверки и сопоставления CSV файлов с POJO!
Мы (команда Super CSV) только что выпустили новую версию (вы можете download от SourceForge или Maven).
В следующем примере используется CsvDozerBeanReader
(новый читатель, который мы только что выпустили, который использует Dozer для отображения bean с глубоким отображение и поддержка на основе индексов) - он основан на примере нашего сайта. Если вам не нужна функция Dozer (или вам просто нужна простая автономная зависимость), вы можете использовать CsvBeanReader
вместо этого (см. Этот пример кода).
Вот пример 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 будет считана в классе SurveyResponse, каждый из которых имеет список Answer s. Для того, чтобы отображение работало, ваши классы должны быть действительными Javabeans (у меня есть конструктор no-arg по умолчанию, и для каждого поля определены определители/определители).
В Super CSV вы определяете сопоставление с простым массивом String - каждый элемент массива соответствует столбцу в файле 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 имеет полезную библиотеку cell processor, которая может быть использована для преобразования строк из файла CSV в другие типы данных (например, Date, Integer) или для проверки ограничений (например, обязательный/необязательный, соответствие регулярному выражению, проверка диапазона).
Использование сотовых процессоров полностью необязательно - без них каждый столбец CSV будет String, поэтому каждое поле также должно быть String.
Ниже приведена конфигурация процессора ячеек для примера. Как и при сопоставлении полей, каждый элемент массива представляет столбец 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 файл и т.д.), а разделитель и символ кавычки настраиваются с помощью preferences (из которых имеется ряд предопределенных конфигураций, которые удовлетворяют большинству способов использования).
Код ниже довольно понятен.
Создайте читателя (с помощью Reader
и настроек)
(необязательно) прочитать заголовок
Настройте отображение bean
Продолжайте звонить 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]]]
Вы можете найти гораздо больше информации на веб-сайте!
Я могу порекомендовать SuperCSV. Прост в использовании и сделал все, что мне нужно.
Эй, у меня есть проект с открытым исходным кодом для этого: JFileHelpers. Я считаю, что главное преимущество заключается в том, что он использует аннотации Java, посмотрите:
Если у вас есть этот bean:
@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");
Кроме того, он поддерживает master-detail, преобразование даты и формата и многое другое. Дайте мне знать, что вы думаете!
С уважением!
Я нахожу Flatpack, чтобы быть действительно хорошим с обработкой причудливых CSV файлов (экранов, кавычек, плохих записей и т.д.)
Вопрос CSV File to 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
У меня был хороший успех как для синтаксического анализа, так и для записи CSV файлов с Java с помощью OpenCSV. Если вы хотите читать или писать электронную таблицу, совместимую с Excel, с помощью Java, POI библиотека от Apache - это путь.
Смотрите CVSBeans