Прочитать csv файл java

Обновлено: 06.07.2024

Файл со значениями, разделенными запятыми (CSV) - это обычный текстовый файл, в котором данные хранятся по столбцу за столбцом и разделены разделителем (например, обычно это запятая «,»).

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

    Для проекта maven вы можете включить зависимость OpenCSV maven в файл pom.xml.

  1. CSVReader - этот класс обеспечивает операции для чтения файла CSV в виде списка массива String.
  2. CSVWriter - этот класс позволяет нам записывать данные в файл CSV.
  3. CsvToBean - этот класс будет использоваться, когда вы хотите заполнить Java-бины из содержимого файла CSV.
  4. BeanToCsv - этот класс помогает экспортировать данные в файл CSV из вашего Java-приложения.

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

Для чтения CSV-файла вам понадобится класс CSVReader. Ниже приведен образец файла CSV, который мы прочитаем.

    Чтение данных построчно: давайте посмотрим, как построчно читать CSV-файл. Для чтения данных построчно, сначала мы должны создать и инициализировать объект CSVReader, передав объект чтения файла CSV-файла. После этого мы должны вызвать метод readNext () объекта CSVReader для чтения данных построчно, как показано в приведенном ниже коде.

Когда мы читаем файл csv по умолчанию, заголовок не игнорируется, как показано в выводе приведенных выше кодов. Когда нам нужно пропустить первый элемент в списке, мы можем указать начальную строку при создании CSVReader.

CSVReader csvReader = new CSVReaderBuilder(filereader)

Чтение CSV-файла с другим разделителем

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

Для пользовательского разделителя создается первый CSVParser с определенным символом парсера.

Затем мы создадим объект CSVReader с помощью метода CSVParser () вместе с конструктором и предоставим созданный объект парсера параметру метода withCSVParser. При последнем вызове метода сборки для создания объекта.


Заметка
Прочитайте этот документ RFC4180 для формата значений, разделенных запятыми (CSV).

В файле CSV обычно есть две проблемы:

1. Поле, содержащее разделитель, например, разделитель является запятой, а поле, содержащее запятые:

2. Двойные кавычки используются для включения полей и поля, содержащего двойные кавычки. Чтобы решить эту проблему, двойная кавычка, появляющаяся внутри поля, должна быть экранирована, предшествуя другой двойной кавычке ( RFC4180 )

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

  1. Простое решение для анализа простого отформатированного файла CSV.
  2. Расширенное решение для анализа странного отформатированного файла CSV (поле, содержащее разделитель или двойные кавычки)
  3. Стороннее решение, пример OpenCSV.

1. Простое решение

Если вы уверены, что файлы CSV не содержат «разделитель или двойные кавычки», просто используйте стандартный split() проанализировать файл CSV.

1.1 Просмотрите простой файл CSV

1.2 Никакой магии, просто прочитайте текстовый файл выше и разделите его запятыми.

1.3 Для JDK 7 и выше используются try-ресурсы.

2. Предварительное решение

Это решение решит проблему с полем, содержащим разделитель или двойные кавычки, а также поддержит пользовательский разделитель и пользовательское закрытое поле. Просмотрите следующий пример разбора CSV, а также тестовые примеры JUnit, чтобы понять, как это работает.

Заметка
Снова, если двойная кавычка, появляющаяся в поле, должна быть экранирована, предшествуя ему другой двойной кавычкой, например

2.1 Просмотрите другой файл CSV

3.3 Просмотрите следующий модульный тест, он проверяет проблему «запятые и двойные кавычки».

3.4 Просмотрите другой модульный тест, он протестирует пользовательский разделитель и пользовательское поле.

3. Пример OpenCSV

3.2 Просмотр файла CSV.

3.2 Пример OpenCSV для разбора файла CSV.

Заметка
Пожалуйста, обратитесь к этой официальной документации OpenCSV для большего количества примеров.

Это первая статья в короткой серии, посвященной библиотекам для чтения и записи Csv на Java .

Чтение и запись Csv в ядре Java

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

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

Простая комбинация FileReader , BufferedReader и String.split() может облегчить чтение данных из Csv. Давайте рассмотрим шаги , чтобы открыть базовый файл CSV и проанализировать содержащиеся в нем данные:

Массив данных Строк будет содержать список полей в каждой строке файла, найденного в пути к файлу Csv . Если файл CSV имеет разделитель, отличный от запятой, его можно указать в методе split . Например, другим распространенным разделителем является вкладка для файлов с разделенными вкладками значениями (CSV).

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

Чтобы проверить, существует ли файл, в наш код можно внести следующие изменения:

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

Написание резюме на языке Java

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

Самый простой способ-использовать объект FileWriter и обрабатывать файл CSV как любой другой текстовый файл. В нашем примере данные хранятся в некоторых объектах List , которые мы просто перебираем и добавляем в программу записи:

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

Вывод

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

Если вам интересно прочитать о других способах чтения и записи Csv на Java, обязательно ознакомьтесь с другими нашими статьями:

Это последняя статья в короткой серии, посвященной библиотекам для чтения и записи CSV на Java , и прямое продолжение предыдущей статьи - Чтение и запись CSV на Java с помощью Apache Commons CSV .

OpenCSV

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

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

OpenCSV также включен вMVNRepository , что упрощает управление зависимостями.

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

OpenCSV не имеет такого большого разнообразия предопределенных форматов, как Apache Commons CSV. Он полагается на два парсера:

  • CSVParser - исходный синтаксический анализатор, определенный в OpenCSV. Это работает для большинства простых экземпляров синтаксического анализа, но не работает, если есть escape-символы, определенные как часть самой записи.
  • RFC4180Parser - аналог CSVFormat.RFC4180 в Apache Commons CSV. Работает с CSV-файлами, отформатированными в соответствии со спецификациями RFC 4180. Эта версия анализатора рассматривает все символы между открывающими и закрывающими кавычками как содержимое, за исключением символа двойной кавычки, который необходимо экранировать другой двойной кавычкой.

Чтение CSV с OpenCSV

Чтение CSV с помощью OpenCSV происходит быстрее, чем с Apache Commons CSV, поскольку CSVWriter реализован как многопоточный при использовании CSVToBean.parse() .

CSVReader также реализован с использованием Java Iterable , поэтому можно управлять ограничениями памяти и времени в зависимости от выбранного вами метода реализации.

OpenCSV имеет два типа объектов для чтения CSV - CSVReader и его подкласс CSVReaderHeaderAware .

CSVReader похож на своего CSVParser Apache Commons и может использоваться как для простых, так и для сложных сценариев синтаксического анализа.

Чтобы перебрать каждую запись в файле CSV, где record будет массивом строк с разделенными запятыми значениями, разделенными на отдельные поля:

Если ваш CSV разделен символом, отличным от запятой, вы можете вместо этого использовать конструктор с двумя параметрами и указать разделитель, который вы хотите использовать в CSVReader .

Например, если ваш CSV содержит значения, разделенные табуляцией, вы можете инициализировать CSVReader следующим образом:

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

Это помогает, поскольку позволяет обрабатывать записи CSV как общий набор данных, а не как набор отдельных полей.

Если имена заголовков обрабатываемого файла согласованы, вы можете аннотировать столбцы с @CSVBindByName аннотации @CSVBindByName и позволить OpenCSV позаботиться о сопоставлении и копировании стороны обработки проанализированных данных.

Например, с нашим древовидным набором данных:

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

При необходимости к методам получения и установки могут быть добавлены проверки, а обязательные поля могут быть указаны путем установки required в аннотации.

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

В этом случае флаг и отображение могут быть указаны с аннотацией:

Если ваш CSV-файл не имеет заголовка, вы можете сопоставить его по положению столбца вместе с аннотацией @CSVBindByPosition

Имейте в виду, что позиции OpenCSV отсчитываются от 0:

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

Написание CSV с OpenCSV

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

Запись из списка объектов требует, чтобы объекты были инициализированы и объявлены заранее. Итак, чтобы не усложнять задачу, давайте рассмотрим работу с массивом строк.

Чтобы создать файл CSV с данными из массива строк:

OpenCSV работает с концепцией, что CSV - это не просто значения, разделенные запятыми; он позволяет вам определить, какой разделитель вы хотите использовать в файле в качестве параметра в конструкторе CSVWriter

Точно так же при определении массива String вам может быть полезно объявить String, а затем разделить его на значения на основе разделителя. Это особенно полезно, когда вам нужно скопировать выбранное подмножество строк данных из одного CSV-файла или файла базы данных в другой.

При инициализации CSVWriter использование FileWriter или Writer является обязательным. Инициализация модуля записи с использованием только одного параметра приводит к созданию файла по умолчанию, разделенного запятыми.

Есть несколько дополнительных параметров для конкретных случаев использования:

  • Char separator - разделитель. Если не объявлено, разделителем по умолчанию будет запятая.
  • Char quotechar - символ кавычки. Это будет использоваться в том случае, если ваш набор данных содержит значение с запятой как часть набора данных, и вам нужно сгенерировать файл, разделенный запятыми. Обычно в качестве символов кавычек используются двойные кавычки, одинарные кавычки или косые черты.
  • Char escapechar - обычно используется для выхода из quotechar .
  • String lineend - строка или символ, определяющий конец строки данных.

Вы можете CSVWriter включая все необязательные параметры:

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

Например, после объявления:

Вы можете использовать:

Или используйте OpenCSV, используя значения по умолчанию, если значения не определены явно в конструкторе, и просто вызовите:

Поэтому, если ваши данные включают строку с именем пользователя и адресом, например: JohnDoe, 19/2, ABC Street, Someplace , фактический формат строки, в котором вам нужно, чтобы это было "JohnDoe", "19 // Улица ABC, 2 /, Где-то " .

Заключение

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

Решил сделать свой вклад в мировое open-source сообщество. Как вы уже догадались из названия статьи, на этот раз речь пойдет о формате CSV и о работе с CSV в Java.

Итак, проблема заключалась в том, что генерация отчетов в формате Excel через библиотеку POI кушала много оперативной памяти и процессорного времени. Сам по себе Excel, наверное, один из немногих действительно хороших продуктов компании Microsoft, но вот формат файлов оставляет желать лучшего. Короче говоря, при генерации документа необходимо полностью держать его в памяти.

Выходом из ситуации является использование формата CSV (comma-separated values file format), который к счастью тоже читается с помощью Excel.

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

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

Все различия между Excel CSV и Pure CSV вынесены в удобно конфигурируемые свойства:

  • delimiter - разделитель, по умолчанию - ";"
  • preserveSpaces - сохранять ли пробелы при чтении, по умолчанию - "true"
  • ignoreEmptyLines - игнорировать ли пустые линии (то есть те, в которых нет значений и разделителей), по умолчанию - "false"
  • ignoreComments - игнорировать ли комментарии, по умолчанию - "false"

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

Ниже представлены примеры кода на Java с использованием библиотеки.

Для создания и записи в CSV файл:

В результате выполнения этого кода будет сгенерирован следующий файл:

А это вариант для чтения данных из CSV (предположим, что мы читаем файл сгенерированный в предыдущем примере):

Результат будет таким:

Для более изощренных вариантов использования посмотрите файл CsvTestCase из папки src библиотеки. В jar этот тест кейс я не вносил, чтобы не создавать лишние dependency на библиотеку.

Updated (07.04.2008): Смешно, конечно, но уже 3-ий раз меняю логику обработки исключений в библиотеке, а точнее имена и иерархию исключений. При этом остальной код остался без изменений.

Читайте также: