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

StackOverflow https://stackoverflow.com/questions/200609

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Приведенный ниже код не требует пояснений.

  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]]]

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

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

Я могу порекомендовать СуперКСВ.Простой в использовании и сделал все, что мне было нужно.

Эй, у меня есть проект с открытым исходным кодом для этого: 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

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

Видишь CVSBeans

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top