Можете ли вы порекомендовать библиотеку Java для чтения (и, возможно, записи) файлов CSV?

Можете ли вы порекомендовать библиотеку Java для чтения, разбора, проверки и сопоставления строк в файле с разделителями-запятыми (CSV) для объектов значений Java (JavaBeans)?

Ответ 2

Super CSV - отличный выбор для чтения/разбора, проверки и сопоставления CSV файлов с POJO!

Мы (команда Super CSV) только что выпустили новую версию (вы можете download от SourceForge или Maven).

Чтение файла CSV

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

Дополнительная информация

Вы можете найти гораздо больше информации на веб-сайте!

Ответ 3

Я могу порекомендовать SuperCSV. Прост в использовании и сделал все, что мне нужно.

Ответ 4

Эй, у меня есть проект с открытым исходным кодом для этого: 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, преобразование даты и формата и многое другое. Дайте мне знать, что вы думаете!

С уважением!

Ответ 5

Я нахожу Flatpack, чтобы быть действительно хорошим с обработкой причудливых CSV файлов (экранов, кавычек, плохих записей и т.д.)

Ответ 6

Вопрос 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

Ответ 7

У меня был хороший успех как для синтаксического анализа, так и для записи CSV файлов с Java с помощью OpenCSV. Если вы хотите читать или писать электронную таблицу, совместимую с Excel, с помощью Java, POI библиотека от Apache - это путь.

Ответ 8

Смотрите CVSBeans