Библиотеки для чтения и записи CSV на Java

Введение CSV означает значения, разделенные запятыми [https://en.wikipedia.org/wiki/Comma-separated_values], метод форматирования данных, который использовался еще до того, как использование персональных компьютеров стало широко распространенным. Формат приобрел популярность, потому что первые компьютеры использовали перфокарты [https://en.wikipedia.org/wiki/Punched_card] для обработки данных, а значения, разделенные запятыми, легче вводить, чем традиционные данные в табличном формате в фиксированных столбцах. . В настоящее время файлы CSV являются типичными.

Вступление

CSV означает значения, разделенные запятыми , метод форматирования данных, который использовался еще до того, как персональные компьютеры получили широкое распространение. Формат приобрел популярность, потому что первые компьютеры использовали перфокарты для обработки данных, а значения, разделенные запятыми, легче вводить, чем традиционные табличные данные в фиксированных столбцах.

В настоящее время файлы CSV обычно используются для передачи данных между приложениями или системами, выступая в качестве общего формата для экспорта данных из одной системы и их импорта обратно в другую.

Формат CSV обычно состоит из информации, организованной в виде строк, состоящих из нескольких полей, разделенных разделителем, при этом одна строка эквивалентна одной записи данных. Разделитель может быть запятой, точкой с запятой или символом табуляции. Не существует конкретного формата, хотя спецификация под названием RFC 4180 была представлена в попытке стандартизировать идеальное поведение CSV-файла.

RFC 4180

«RFC» означает « запрос комментариев» , что означает, что документ представляет собой набор общих спецификаций или руководящих принципов, а не принятых правил.

Существует много отклонений от указанного формата в способах создания и чтения файлов CSV современными приложениями, но большинство систем придерживаются первоначальных рекомендаций, изложенных в RFC 4180.

Согласно RFC 4180 файлы CSV должны иметь следующие общие черты:

  • Каждая запись должна быть на отдельной строке с разрывом символа в конце строки.
  • Может быть, а может и не быть строки заголовка. Наличие заголовка можно указать в параметре header типа MIME .
  • Тип MIME для файлов CSV, официально зарегистрированных в IANA, - «text / csv».
  • Каждая запись может состоять из одного или нескольких полей, разделенных запятыми, и одинаковое количество полей должно сохраняться во всем файле (во всех записях должно быть одинаковое количество полей).
  • Если поле содержит запятые, разрывы строк или двойные кавычки, оно должно быть заключено в двойные кавычки.

Зачем использовать CSV для операций ввода-вывода с Java

Файлы CSV удобочитаемы и проще для понимания, чем другие форматы передачи данных, такие как XML или JSON .

Файлы CSV можно импортировать в большинство приложений для работы с электронными таблицами, таких как Excel , Google Sheets и OpenOffice Calc , и их легко создать - существующий .xls или .xlsx можно преобразовать в формат CSV в самом Excel, если файл содержит только символы и не макросы, изображения и т. д.

Формат компактен и обычно меньше по размеру, что обеспечивает более быструю обработку и создание. Для сравнения, XML требует повторения; обычно имя заголовка столбца повторяется дважды для каждой строки с начальным и конечным тегами (вместе с символами, связанными с синтаксисом), тогда как CSV требует заголовков столбцов только один раз, обычно в самой первой строке.

Учитывая все эти факторы, возможность чтения и записи в файлы CSV является ключевым навыком для любого разработчика Java.

Чтение и запись CSV в Core Java

Благодаря популярности и широкому распространению CSV в качестве формата для передачи данных существует множество библиотек синтаксического анализатора, которые можно использовать вместе с Java.

Сторонние парсеры определяют общие форматы и могут работать с различными разделителями, обрабатывать специальные символы и иногда даже читать недвоичные данные. Однако по-прежнему важно иметь возможность обрабатывать файлы CSV с помощью ядра Java без использования каких-либо дополнительных библиотек.

Простая комбинация FileReader , BufferedReader и String.split() может облегчить чтение данных из CSV.

Чтение и запись CSV с помощью Apache Commons CSV

Библиотека CSV Apache Commons

  • это версия синтаксического анализатора Java CSV от Apache Software Foundation. Согласнорезюме проекта , он пытается « предоставить простой интерфейс для чтения и записи файлов CSV различных типов ».

Как и все библиотеки, связанные с Apache, он работает с лицензией Apache , что означает, что его можно свободно использовать, распространять и изменять.

Чтение и запись CSV с OpenCSV

OpenCSV - один из самых простых и легких для понимания парсеров CSV, использующий стандартные Reader / Writer и предлагающий CSVReader поверх.

Как и Apache Commons CSV, OpenCSV работает с лицензией Apache 2.0. Прежде чем загружать и решать, использовать ли парсеры OpenCSVs, вы можете просмотреть исходный код и документы Java и даже проверить их набор тестов JUnit, который включен в их репозиторий git.

Сторонние библиотеки для операций ввода-вывода CSV

Знание того, как читать и писать в CSV-файл в ядре Java, важно и обычно достаточно для большинства основных операций. Однако есть случаи, когда полагаться на стороннюю библиотеку можно.

Например, наше собственное использование split для анализа файла CSV без использования указанных выше библиотек приведет к сбою, если сами поля содержат запятые. Мы могли бы расширить нашу логику, чтобы она соответствовала этому сценарию, но зачем изобретать велосипед, если для использования уже доступны проверенные решения?

Именно здесь на помощь приходят библиотеки - большинство из них поддерживают различные конфигурации и идентифицируют escape-символы и символы конца файла, которые часто используются различными системами, наборами продуктов и базами данных, поэтому нам не нужно отслеживать, внедрять и тестировать каждую конфигурацию мы сами.

Существует множество различных библиотек синтаксического анализа, доступных бесплатно, каждая из которых имеет свои сильные стороны. Давайте рассмотрим некоторые из наиболее популярных библиотек для синтаксического анализа CSV с помощью Java, сравнив их плюсы и минусы.

Другие библиотеки CSV

Помимо Apache Commons CSV и OpenCSV, существует множество других анализаторов CSV, доступных для использования. Давайте кратко рассмотрим некоторые другие библиотеки и сравним их использование , преимущества и недостатки:

SuperCSV

SuperCSV - еще одна доминирующая библиотека синтаксического анализа CSV. Реализация SuperCSV поддерживает форматы, которые не рассматриваются другими основными синтаксическими анализаторами.

Подобно методам аннотации OpenCSV, SuperCSV предлагает поддержку POJO для работы с Java Beans в дополнение к обычным спискам и картам.

Кодирование и декодирование также выполняется библиотекой, если файл соответствует формату, указанному в спецификации SuperCSV . Если файл не соответствует требованиям, вы все равно можете определить настраиваемый разделитель, символ кавычек или символ новой строки по мере необходимости или расширить исходный код для выполнения определенных требований.

Синтаксический анализ упрощается за счет параметров форматирования данных, доступных в SuperCSV, которые позволяют обрезать и заменять регулярные выражения во время обработки. Библиотека также поддерживает потоковый ввод и вывод, что делает ее управляемой с точки зрения производительности и систем с ограничениями памяти.

Библиотека SuperCSV также позволяет частичное чтение и частичную запись, что не поддерживается другими парсерами CSV, которые мы обсуждали в этой статье. Вы можете установить для определенных значений столбца заголовка значение null и продолжить обработку оставшихся столбцов или написать набор данных, содержащий необязательные значения, без добавления собственной обработки ошибок.

Большой недостаток, который заслуживает упоминания, заключается в том, что библиотека, похоже, не поддерживается - последняя дата публикации - четыре года назад - в 2015 году, хотя в репозиторий git есть более поздние дополнения.

Парсер CSV UniVocity

UniVocity CSV Parser громко заявляет, что является самым быстрым парсером CSV в сравнении 2018 года среди 18 различных общедоступных парсеров CSV. Парсер UniVocity позволяет вам выбирать поля, которые вы хотите проанализировать, пропуская ненужные или необязательные поля в одном файле, что дает ему возможность фильтровать столбцы CSV.

У него больше возможностей настройки, чем у OpenCSV и Apache Commons CSV, что затрудняет настройку и начало работы. Читаемость кода также может быть меньше по сравнению с некоторыми другими библиотеками, поскольку синтаксический анализатор UniVocity требует, чтобы формат, разделитель строк и метод извлечения заголовка были объявлены перед попыткой синтаксического анализа.

С положительной стороны, разнообразие вариантов форматирования и настройки делает его подходящим для работы с «крайними случаями», связанными с файлами CSV, которые не совместимы с RFC4180.

Подобно OpenCSV и Apache Commons CSV, вы можете использовать итератор или определенный класс парсера (в данном случае CsvParser или TsvParser ). Анализаторы CSV UniVocity также поддерживают чтение в bean-компоненты с более сложной настройкой по сравнению с OpenCSV.

Запись - это такой же сложный, но настраиваемый процесс с анализатором CSV UniVocity с конкретными вариантами использования, такими как возможность определять преобразования значений и выбор столбцов. Также поддерживается запись непосредственно с карты или аннотированных компонентов Java Beans.

FlatPack CSV Parser

FlatPack CSV Parser является быстрым и более подходящим для работы с очень большими файлами, сортировкой файлов перед синтаксическим анализом и синтаксическим анализом фиксированной ширины. Его можно использовать в сценарии, когда ваш CSV не имеет определенного разделителя, но, например, состоит из текста фиксированной ширины. Синтаксический анализатор также поддерживает отображение столбцов с помощью спецификаций XML, где поля в XML и поля данных в CSV расположены в одном порядке.

BuffReaderDelimiterFactory позволяет передавать файлы большего размера в потоковом режиме, чтобы при анализе данных все BuffReaderDelimiterFactory Столбцы также можно добавлять, удалять или игнорировать при необходимости.

Поскольку библиотека ориентирована на удобство работы с большими файлами, она также позволяет исключить неверные данные и добавить их в коллекцию ошибок для последующей обработки. Это позволяет избежать повторной обработки большого набора данных из-за одной или двух ошибок и упрощает обработку ошибок.

Библиотека в настоящее время поддерживается, а самая последняя публикация вышла в 2019 году. Она имеет определенные сильные стороны, но ее может быть сложно настроить и понять из-за множества опций и функций настройки, представленных для обработки очень конкретных сценариев, не совместимых с RFC4180.

Заключение

Самые простые сценарии чтения и записи CSV могут быть обработаны с использованием ядра Java IO с BufferedReader s, FileWriter s и настраиваемой обработкой ошибок. Однако внешние библиотеки предоставляют проверенные и проверенные решения, когда дело доходит до более сложных операций, которые включают возможность поддержки больших файлов, которые могут соответствовать или не соответствовать RFC 4180, с различными разделителями и различными требованиями.

Производительность и гибкость вашего приложения зависят от выбранного вами варианта - одни парсеры лучше управляют памятью, а другие более гибкие и настраиваемые.

Вы можете использовать эту статью в качестве руководства, чтобы определить, какая библиотека лучше всего соответствует вашим потребностям, и изучить основы обработки файлов CSV, а также чтения и записи CSV на Java.

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus