Чтение CSV-файла в Java
Для некоторого круга задач автоматизации обмена данными между различными приложениями необходимо работать с форматом CSV. Рассмотрим способы работы с этим форматом в Java.
Как обычно при реализации таких решений есть два пути. Написать все самому и использовать готовый пакет. К примеру, товарищ mycong предложил вариант в рукопашную сделать обработчик CSV, этот путь хорош, если необходимо соблюдать требования лицензионной чистоты или используемая платформа ограничена в объеме памяти для хранении программы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
package com.mkyong.util; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class ReadCVS { public static void main(String[] args) { ReadCVS obj = new ReadCVS(); obj.run(); } public void run() { String csvFile = "/Users/mkyong/Downloads/GeoIPCountryWhois.csv"; BufferedReader br = null; String line = ""; String cvsSplitBy = ","; try { br = new BufferedReader(new FileReader(csvFile)); while ((line = br.readLine()) != null) { // use comma as separator String[] country = line.split(cvsSplitBy); System.out.println("Country [code= " + country[4] + " , name=" + country[5] + "]"); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (br != null) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } System.out.println("Done"); } } |
Здесь мы видим, что просто читаются строки и по символу запятая отделяется одно значение от другого. Все бы ничего, но у меня в одном из проектов требовалось читать строковые данные в которых было что? Правильно. Запятая 😉 Сам формат CSV предусматривает подобные ситуации, но для реализации потребуется написать гораздо больше кода.
Для ентерпрайзненьких решений, как было в моем случае, можно и подключить библиотеку, реализующую чтение из формата CSV. Мне понравилась библиотека opencsv. Она хоть и не обновлялась с 2011 года, но и формат тоже пылью покрылся. Из библиотеки на понадобится один класс CSVReader. У нас есть несколько конструкторов класса, которые позволяют задать разделитель, поток, из которого читаем данные, символ кавычек, экранирования и даже количество строк, которые нужно пропустить перед читаемыми данными.
Для получения данных можно использовать метод readAll который прочитает все строки сразу в список строк или же использовать метод readNext для построчного чтения данных. Так жые есть итератор в классе. В общем читаем документацию при необходимости. Ну и пример использования напоследок:
1 2 3 4 5 6 7 |
String csvFile = "example.csv"; char cvsSplitBy = ';'; CSVReader reader = new CSVReader(new FileReader(csvFile),cvsSplitBy); String[] stringOfData; while ((stringOfData = reader.readNext()) != null) { system.out.println(stringOfData[0]); } |
выводим первый элемент данных в каждой строке CSV-файла.