2 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Чтение и запись CSV файла с помощью SuperCSV в Java

Чтение и запись CSV файлов в Java (comma separated values)

Решил сделать свой вклад в мировое 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 на библиотеку.

Читать еще:  10 интересных и полезных сервисов Google для обычных пользователей

Библиотека является свободной для использования и распространения. Скачать ее можно здесь — Java CSV Library. Постарался покрыть код тестами как можно плотнее. Тесты в архиве.

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

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

Работаем с файлами CSV в Java с использованием библиотеки OpenCSV

CSV означает « comma-separated values (значения, разделенные запятыми)». Файлы CSV в основном используются для создания файлов данных, либо для экспорта данных, либо для импорта данных. Язык Java не предоставляет никакой собственной поддержки для эффективной обработки файлов CSV и без использования сторонних библиотек, вы в конечном итоге создаете свой собственный синтаксический анализатор CSV. Поэтому рекомендуется использовать сторонние инструменты для разбора CSV-файлов.

OpenCSV — это такой инструмент, который является очень простой библиотекой парсеров CSV для Java. OpenCSV поддерживает все основные вещи для работы с csv, которые вам могут понадобиться. И некоторые из них мы рассмотрим в этом уроке.

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

Зависимости OpenCSV

Если вы работаете над проектом с помощью maven, вы можете включить зависимость maven для OpenCSV в файле pom.xml, как показано ниже:

Также вы можете загрузить jar-файлы из http://sourceforge.net/projects/opencsv/, если вы не используете maven.

Некоторые полезные классы

Ниже приведен список наиболее используемых классов OpenCSV, которые вы должны изучить:

  • CSVParser: очень простой CSV-парсер. Он просто реализует разделение одной строки на поля.
  • CSVReader: вы будете использовать этот класс большую часть времени, читая CSV-файл из вашего Java-кода. Этот класс предоставляет ряд полезных конструкторов для создания CSVReader с различными параметрами и возможностями. Например, Вы можете указать другой разделительный символ (по умолчанию это запятая), другой символ кавычки (по умолчанию — двойная кавычка), и даже вы можете указать номер начальной строки, с которой должен начинаться синтаксический анализ.
  • CSVWriter: CSVWriter также очень настраиваемый класс, как и CSVReader. Вы можете использовать пользовательский разделитель, свои кавычки и т. д.
  • CsvToBean: этот класс будет использоваться, если вы хотите заполнить свои java-компоненты из содержимого файла CSV. Ниже вы увидите пример.
  • BeanToCsv: Если вы хотите экспортировать данные в CSV-файл из приложения Java, вам может понадобиться помощь этого класса.
  • ColumnPositionMappingStrategy: если вы планируете использовать CsvToBean (или BeanToCsv) для импорта CSV-данных, то вы будете использовать этот класс для сопоставления полей CSV с полями java bean.

Чтение и парсинг CSV-файла

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

Вышеприведенный пример читает файл CSV по одной строке и печатает в консоль. Вы можете прочитать весь CSV-файл за один раз, а затем перебрать данные по своему усмотрению. Ниже приведен пример чтения CSV-данных с использованием метода readAll ().

Читать еще:  Деловая переписка на английском языке: фразы и советы

В приведенном выше примере мы читаем весь CSV-файл, а затем мы перебираем строки по очереди.

Создание нового CSV-файла

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

Добавление к уже существующему CSV-файлу

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

Использование пользовательского разделителя для файлов CSV

Пользовательский разделитель может быть указан в конструкторе CSVReader или CSVWriter. Давайте посмотрим на пример. Я изменил разделитель по умолчанию c запятой на точку с запятой.

Связывание CSV с java beans

OpenCSV также предоставляет функциональные возможности для сопоставления CSV-файла со списком Java bean компонентов. Давайте построим для этого небольшой пример.

Ниже пример читает файл data.csv и заполняет экземпляры Employee.java. Затем он проверяет данные, распечатывая их в консоли.

Создание CSV из SQL-данных

Для экспорта данных непосредственно из таблиц SQL в CSV-файл нам понадобится объект ResultSet. Следующий API может использоваться для записи данных в CSV из ResultSet.

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

Вот мы и рассмотрели основные действия с CSV-файлом из Java-кода. Всем удачи.

How to read and write CSV file – Super CSV tutorial

Java language does not provide any native support for effectively handling CSV files. So we will use Super CSV to read CSV file and write a new CSV file in Java.

1. Super CSV maven dependencies

Let’s start by listing down maven dependencies needed to use Super CSV in our project.

If you are using gradle build then use this.

2. Super CSV common classes

Let’s go through main classes we need to know about while working with Super CSV for reading or writing CSV files.

2.1. ICsvBeanReader and CsvBeanReader

ICsvBeanReader (interface) and CsvBeanReader (implementing class) are used to read CSV files. It reads a CSV file by instantiating a bean for every row and mapping each column to a field on the bean.

The bean to populate can be either a class or interface. If a class is used, it must be a valid Java bean, i.e. it must have a default no-argument constructor and getter/setter methods. An interface may also be used if it defines getters/setters – a proxy object will be created that implements the interface.

2.2. ICsvBeanWriter and CsvBeanWriter

ICsvBeanWriter (interface) and CsvBeanWriter (implementing class) are used to write CSV files. It writes a CSV file by mapping each field on the bean to a column in the CSV file (using the supplied name mapping).

Читать еще:  Настройки параметров учета в 1С УПП и Комплексной 1.1.: Режим учета затрат

2.3. CellProcessor

CellProcessor instances are used to read a value from CSV file and process it before setting it to java bean class/interface. e.g. We want to convert a value to Date object or even you may want to run some regex validation over values.

2.4. CsvPreference

Before reading or writing CSV files, you must supply the reader/writer with some preferences. Essentially it means that you are setting delimiter related configuration in CSV file. e.g. CsvPreference.STANDARD_PREFERENCE means :

We can also create your own preferences. For example if your file was pipe-delimited, you could use the following:

3. How to read a CSV file

Now let’s see an example of reading a CSV file using above described classes. I will read below given data.csv :

Now look at CSV file, first row is column names. They should match up exactly with the bean’s field names, and the bean has the appropriate setters defined for each field.

If the header doesn’t match (or there is no header), then we can simply define your own name mapping array. [I have commented out the line, but you may take the hint.]

4. How to partially read CSV file

Partial reading allows us to ignore columns when reading CSV files by simply setting the appropriate header columns to null . For example, in below code I have decided NOT to read the PinCode column.

4.1. Complete Example

5. how to read CSV file in key-value pair

To read in key value pairs, we need to use CsvMapReader. It allows you to retrieve each column by name from the resulting Map, though you’ll have to cast each column to it’s appropriate type.

6. How to read CSV file with arbitrary number of columns

Some CSV files don’t conform to RFC4180 and have a different number of columns on each row. If you have got such a CSV file, then your will need to use CsvListReader, as it’s the only reader that supports it.

Read such files is tricky, as you do not know the number of columns in any row. So you read all columns in a row in a List and then based on size of list, you determine how you may want to handle the read values.

Let’s modify the data.csv and remove some data from it randomly.

Let’s read this CSV file.

7. How to Write a new CSV file

Writing a CSV file is as much simple as it was for reading the CSV file. Create CsvBeanWriter instance, define headers and processors and write the beans. It will generate the CSV file with data values populated from beans.

Super csv writer example.

Output of above program will be written in file temp.csv as below:

That’s all for simple usecases and examples of using Super CSV for reading and writing CSV files in various ways.

Drop me your questions in comments section.

Ссылка на основную публикацию
Статьи c упоминанием слов:
Adblock
detector