Чтение и запись CSV файла с помощью SuperCSV в Java
Чтение CSV-файла в Java с использованием OpenCV
Файл с разделенными запятыми значениями (CSV) — это обычный обычный текстовый файл, который хранит данные в столбце за столбцом и разделяет их по разделителю (например, обычно это запятая «,»).
OpenCSV — это библиотека синтаксического анализатора CSV для Java. OpenCSV поддерживает все основные операции типа CSV, которые вы хотите выполнить. Java 7 в настоящее время является минимально поддерживаемой версией для OpenCSV. Язык Java не предоставляет никакой собственной поддержки для эффективной обработки файлов CSV, поэтому мы используем OpenCSV для обработки файлов CSV в Java.
Как использовать OpenCSV
- Для проекта maven вы можете включить зависимость maven OpenCSV в файл pom.xml.
groupId >com.opencsv groupId >
artifactId >opencsv artifactId >
version >4.1 version >
Некоторые полезные классы opencsv
- CSVReader — этот класс предоставляет операции для чтения файла CSV в виде списка массива String.
- CSVWriter — этот класс позволяет нам записывать данные в файл CSV.
- CsvToBean — этот класс будет использоваться, когда вы хотите заполнить ваши Java-бины из содержимого файла CSV.
- BeanToCsv — Этот класс помогает экспортировать данные в файл CSV из вашего Java-приложения.
Чтение CSV-файла
Для чтения файла CSV вам нужен класс CSVReader. Ниже приведен пример CSV-файла, который мы прочитаем.
Мы можем прочитать CSV-файл двумя способами:
- Читать данные построчно: давайте посмотрим, как читать файл CSV построчно. Для чтения данных построчно, сначала мы должны сконструировать и инициализировать объект CSVReader, передав объект чтения файлов файла CSV. После этого мы должны вызвать метод readNext () объекта CSVReader для построчного чтения данных, как показано в приведенном ниже коде.
// Java-код для иллюстрации чтения
// CSV файл построчно
public static void readDataLineByLine(String file)
// Создать объект для чтения файлов
// класс с CSV-файлом в качестве параметра.
FileReader filereader = new FileReader(file);
// создать передачу объекта csvReader
// читатель файла как параметр
CSVReader csvReader = new CSVReader(filereader);
// мы будем читать данные построчно
while ((nextRecord = csvReader.readNext()) != null ) <
for (String cell : nextRecord) <
catch (Exception e) <
Чтение всех данных одновременно: мы читаем записи CSV одну за другой, используя метод readNext (). CSVReader также предоставляет метод readAll () для чтения всех записей сразу в список.
Когда мы читаем CSV-файл по умолчанию, заголовок не будет игнорироваться, как показано в выходных данных выше кодов. Когда нам нужно пропустить первый элемент в списке, мы можем указать начальную строку при создании CSVReader.
// Java-код для иллюстрации чтения
// все данные одновременно
public static void readAllDataAtOnce(String file)
// Создать объект для чтения файлов
// класс с CSV-файлом в качестве параметра.
FileReader filereader = new FileReader(file);
// создаем объект csvReader и пропускаем первую строку
CSVReader csvReader = new CSVReaderBuilder(filereader)
List allData = csvReader.readAll();
for (String[] row : allData) <
for (String cell : row) <
catch (Exception e) <
Чтение CSV-файла с другим разделителем
Файлы CSV могут быть разделены с помощью разделителя, отличного от запятой, например, точка с запятой, канал и т. Д. В следующем примере показано, как прочитать данные файла CSV, разделенные точкой с запятой.
Пример файла CSV, разделенного точкой с запятой:
Для Пользовательского разделителя сначала создается CSVParser с определенным символом анализатора.
Затем мы создадим объект CSVReader с методом CSVParser () вместе с constrctor и предоставим созданный объект синтаксического анализа параметру метода withCSVParser. При последнем вызове метода сборки для создания объекта.
// Java-код для иллюстрации
// Чтение CSV-файла с другим разделителем
public static void readDataFromCustomSeperator(String file)
// Создать объект класса чтения файлов с CSV-файлом в качестве параметра.
FileReader filereader = new FileReader(file);
// создаем объект csvParser с
// пользовательский разделитель точка с запятой
CSVParser parser = new CSVParserBuilder().withSeparator( ‘;’ ).build();
// создаем объект csvReader с параметром
// читатель файла и парсер
CSVReader csvReader = new CSVReaderBuilder(filereader)
Работаем с файлами 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-кода. Всем удачи.
Чтение и запись 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 на библиотеку.
Библиотека является свободной для использования и распространения. Скачать ее можно здесь – Java CSV Library. Постарался покрыть код тестами как можно плотнее. Тесты в архиве.
Хочется сделать библиотеку лучше и исправить ошибки, если они там не дай бог есть. Поэтому очень жду ваших вопросов и замечаний.
Updated (07.04.2008): Смешно, конечно, но уже 3-ий раз меняю логику обработки исключений в библиотеке, а точнее имена и иерархию исключений. При этом остальной код остался без изменений.
Чтение и запись 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 на библиотеку.
Библиотека является свободной для использования и распространения. Скачать ее можно здесь – Java CSV Library. Постарался покрыть код тестами как можно плотнее. Тесты в архиве.
Хочется сделать библиотеку лучше и исправить ошибки, если они там не дай бог есть. Поэтому очень жду ваших вопросов и замечаний.
Updated (07.04.2008): Смешно, конечно, но уже 3-ий раз меняю логику обработки исключений в библиотеке, а точнее имена и иерархию исключений. При этом остальной код остался без изменений.
How to read and write CSV file – Super CSV tutorial
By Lokesh Gupta | Filed Under: Java Libraries
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).
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.
Как читать и анализировать CSV-файл в Java
Файл с разделенными запятыми значениями (CSV) – это обычный обычный текстовый файл, который хранит данные в столбце за столбцом и разделяет их по разделителю (например, обычно это запятая «,»).
Заметка
Прочитайте этот документ RFC4180 для формата значений, разделенных запятыми (CSV).
В файле CSV обычно есть две проблемы:
1. Поле, содержащее разделитель, например, разделитель является запятой, а поле, содержащее запятые:
2. Двойные кавычки используются для включения полей и поля, содержащего двойные кавычки. Чтобы решить эту проблему, двойная кавычка, появляющаяся внутри поля, должна быть экранирована, предшествуя другой двойной кавычке ( RFC4180 )
В этом руководстве мы покажем вам три примера для чтения, анализа и распечатки значений из файла CSV.
- Простое решение для анализа простого отформатированного файла CSV.
- Расширенное решение для анализа странного отформатированного файла CSV (поле, содержащее разделитель или двойные кавычки)
- Стороннее решение, пример OpenCSV.
1. Простое решение
Если вы уверены, что файлы CSV не содержат «разделитель или двойные кавычки», просто используйте стандартный split() проанализировать файл CSV.
1.1 Просмотрите простой файл CSV
1.2 Никакой магии, просто прочитайте текстовый файл выше и разделите его запятыми.
1.3 Для JDK 7 и выше используются try-ресурсы.
2. Предварительное решение
Это решение решит проблему с полем, содержащим разделитель или двойные кавычки, а также поддержит пользовательский разделитель и пользовательское закрытое поле. Просмотрите следующий пример разбора CSV, а также тестовые примеры JUnit, чтобы понять, как это работает.
Заметка
Снова, если двойная кавычка, появляющаяся в поле, должна быть экранирована, предшествуя ему другой двойной кавычкой, например
2.1 Просмотрите другой файл CSV
2.2 Приведенный ниже пример вдохновлен этой статьей – « Только класс, который вам нужен для файлов CSV » (некоторые исправлены для поддержки других функций, прочитайте «исправленные комментарии»), а также этой библиотекой OpenCSV стороннего производителя .
3.3 Просмотрите следующий модульный тест, он проверяет проблему «запятые и двойные кавычки».
3.4 Просмотрите другой модульный тест, он протестирует пользовательский разделитель и пользовательское поле.
3. Пример OpenCSV
Если вас не устраивает простое и продвинутое решение, попробуйте использовать стороннюю библиотеку CSV – OpenCSV .
3.2 Просмотр файла CSV.
3.2 Пример OpenCSV для разбора файла CSV.
Заметка
Пожалуйста, обратитесь к этой официальной документации OpenCSV для большего количества примеров.