Вступление
CSV-файлы — один из распространенных способов хранения структурированных данных и обмена ими между серверами наряду с другим популярным форматом структурированных данных. Существует множество библиотек для чтения CSV-файлов, и одна из самых популярных — это Open CSV. В этой статье мы применим библиотеку OpenCSV для чтения CSV-файла на языке Java.
Файл на входе
В качестве входного файла воспользуемся набором данных из kaggle, содержащим ежедневный список “Топ-10” на Netflix.


OpenCSV — один из самых популярных парсеров CSV. Он предоставляет как базовые, так и расширенные функциональные возможности, которых более чем достаточно для чтения любого CSV-файла. Например, чтобы пропустить заголовок CSV-файла, нужно воспользоваться методом skip_line
. Если нужно проверить строку, прежде чем ее обрабатывать, такую логику можно задать через интерфейс RowValidator
и отфильтровать все строки, которые не проходят проверку.
Считывание CSV-файла
Считывание файла через CSVReader
Самый простой клиент мы можем создать, воспользовавшись классом CSVReader
. Нам нужно передать объект FileReader
:

После создания CSVReader
мы можем либо считать весь файл в память, либо читать файлы построчно.
Считывание файла целиком в память

Такой подход не будет работать гладко и в конечном итоге приведет к возникновению исключений, если память ограничена.
Я попытался считать файл объемом 1 ГБ, но в итоге получил исключение:


Считывание файла построчно
Воспользовавшись методом readNext()
, мы можем читать по одной строке за раз. Этот метод преобразует всю строку в объект String[]
.

Конфигурирование объекта CSVReader
Класс CSVReader
является настраиваемым и предоставляет шаблон builder
для своей настройки. Например, в приведенном ниже фрагменте кода мы настраиваем этот класс так, чтобы пропускать строку №1, поскольку это заголовок, а также добавляем валидатор строк для проверки номеров столбцов в каждой строке.

Проверка каждой записи с помощью валидатора строк

Считывание CSV-файла в Java Beans
Как правило, когда мы читаем CSV-файл, то преобразуем каждую единицу записи в Java-объект. Например, при считывании информации об учетной записи клиента, мы напишем маппер, который сопоставит прочитанные строковые значения с Java POJO по имени CustomerAccount
. OpenCSV предоставляет аннотацию для привязки CSV-записи к POJO. Нам лишь нужно применить аннотации к полям внутри Java POJO.

Вывод

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

Вывод
В этой статье мы использовали библиотеку OpenCSV для чтения CSV-файла с помощью Java. Эта статья — ознакомительная, но если вы хотите узнать обо всех поддерживаемых функциях для сложных случаев использования, загляните сюда.
Читайте также:
- Почему вы никогда не будете слишком стары, чтобы изучать Java (или любой другой язык программирования)
- Как пользоваться Thread.sleep на JVM без блокировки
- Основы безопасного программирования
Читайте нас в Telegram, VK и Дзен
Перевод статьи Suraj Mishra: How to Read CSV File using Open CSV In Java