Анализ и чтение CSV-файла на Java

Файл CSV используется для хранения табличных данных в виде простого текста. Разделитель-запятая используется для идентификации и разделения различных токенов данных в файле CSV.

  • Файлы CSV(Comma Separated Values) используются потребителями, предприятиями и научными приложениями. Среди наиболее распространенных применений — перемещение табличных данных между программами во время выполнения, которые изначально работают с несовместимыми форматами.
  • Данные CSV популярны, поскольку многие программы и языки поддерживают некоторые вариации CSV, по крайней мере, как альтернативный формат импорта/экспорта.

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

1. Использование библиотеки OpenCSV

OpenCSV — блестящая библиотека для работы с файлами CSV. Она имеет следующие особенности:

  • Чтение произвольного количества значений в строке
  • Игнорирование запятых в кавычках
  • Обработка записей, занимающих несколько строк
  • Настраиваемые символы разделителя и кавычек
  • Прочитайте все записи сразу или используйте модель в стиле итератора.

Импортируйте последнюю версию OpenCSV в зависимости проекта.

 <зависимость><groupId>net.sf.opencsv</groupId><artifactId>opencsv</artifactId><версия>2.3</версия></зависимость>

Пример 1: Чтение CSV-файла построчно в String[]

В данном примере мы используем класс CSVReader из библиотеки OpenCSV, который оборачивает FileReader для чтения фактического файла CSV. Файл использует разделитель запятая.

  • Используя reader.readNext(), мы считываем CSV-файл построчно.
  • Если при чтении файла возникает ошибка, выдается исключение IOException.
  • Он выдает исключение CsvValidationException, если прочитанная строка не является допустимой строкой CSV.
  • Когда все строки прочитаны, метод readNext() возвращает null и программа завершается.
try(CSVReader reader= new CSVReader(new FileReader("SampleCSVFile.csv"))){String [] nextLine;//Read one line at a timewhile((nextLine = reader.readNext()) != null){//Use the tokens as requiredSystem.out.println(Arrays.toString(nextLine));}}catch(IOException | CsvValidationException e) {e.printStackTrace();}

2. Использование библиотеки Super CSV

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

  • Возможность чтения и записи данных в виде классов POJO
  • Автоматическое кодирование и декодирование специальных символов
  • Пользовательский разделитель, символ кавычки и разделитель строк
  • Поддержка процессоров ячеек для обработки каждого токена определенным образом
  • Возможность применения одного или нескольких ограничений, таких как диапазоны чисел, длина строки или уникальность
  • Возможность обработки CSV-данных из файлов, строк, потоков и даже zip-файлов

Добавьте в проект последнюю версию Super CSV.

<dependency><groupId>net.sf.supercsv</groupId><artifactId>super-csv</artifactId><version>2.4.0</version></dependency>

Пример 2: Чтение CSV-файла в POJO

Мы прочитаем следующий CSV-файл.

 CustomerId,CustomerName,Страна,PIN-код,Email10001,Локеш,Индия,110001,abc@gmail.com10002,Джон,США,220002,def@gmail.com10003, Синий, Франция, 330003, ghi@gmail.com

Соответствующий класс POJO:

 Клиент публичного класса{частный Integer CustomerId;частная строка CustomerName;частная строка Страна;частный длинный пин-код;частная строка Email;}

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

import java.io.FileReader;import java.io.IOException;import org.supercsv.cellprocessor.Optional;import org.supercsv.cellprocessor.ParseInt;import org.supercsv.cellprocessor.ParseLong;import org.supercsv.cellprocessor.constraint.NotNull;import org.supercsv.cellprocessor.constraint.StrRegEx;import org.supercsv.cellprocessor.ift.CellProcessor;import org.supercsv.io.CsvBeanReader;import org.supercsv.io.ICsvBeanReader;import org.supercsv.prefs.CsvPreference;public class ReadCSVFileExample {static final String CSV_FILENAME = "data.csv";public static void main(String[] args) throws IOException{try(ICsvBeanReader beanReader= new CsvBeanReader(new FileReader(CSV_FILENAME), CsvPreference.STANDARD_PREFERENCE)){// the header elements are used to map the values to the beanfinal String[] headers = beanReader.getHeader(true);//final String[] headers = new String[]{"CustomerId","CustomerName","Country","PinCode","Email"};final CellProcessor[] processors = getProcessors();Customer customer;while((customer = beanReader.read(Customer.class, headers, processors)) != null) {System.out.println(customer);}}}/*** Sets up the processors used for the examples.*/private static CellProcessor[] getProcessors() {final String emailRegex = "[a-z0-9\\._]+@[a-z0-9\\.]+";StrRegEx.registerMessage(emailRegex, "must be a valid email address");final CellProcessor[] processors = new CellProcessor[] {new NotNull(new ParseInt()), // CustomerIdnew NotNull(), // CustomerNamenew NotNull(), // Countrynew Optional(new ParseLong()), // PinCodenew StrRegEx(emailRegex) // Email};return processors;}}

3. Использование java.util.Scanner

Класс Scanner разбивает свой ввод на токены, используя указанный шаблон разделителя. Разделителем по умолчанию является пробел.

  • Мы можем использовать отдельный сканер для чтения строк и другой сканер для разбора каждой строки на токены. Этот подход может быть бесполезен для больших файлов, поскольку он создает один экземпляр сканера на строку.
  • Для анализа CSV-файла мы можем использовать разделитель-запятую.
  • Затем токены CSV можно преобразовать в значения различных типов данных с помощью различных методов next().

Пример 3: Анализ CSV-файла с помощью Scanner

try(Scanner scanner = new Scanner(new File("SampleCSVFile.csv"))){//Read linewhile(scanner.hasNextLine()) {String line = scanner.nextLine();//Scan the line for tokenstry(Scanner rowScanner = new Scanner(line)) {rowScanner.useDelimiter(",");while(rowScanner.hasNext()) {System.out.print(scanner.next());}}}} catch(FileNotFoundException e) {e.printStackTrace();}

4. Использование BufferedReader и String.split()

В этом подходе мы используем BufferedReader для чтения файла построчно. Затем функция String.split() используется для получения токенов из текущей строки на основе предоставленного разделителя в качестве параметра метода.

Это полезно для небольших строк или файлов.

Пример 4: Разделение CSV-строки или CSV-файла

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

 попробуйте(BufferedReader fileReader= new BufferedReader(new FileReader("SampleCSVFile.csv"))){Строка строки = "";//Читаем файл построчнопока((строка = fileReader.readLine()) != null){//Получить все доступные токены в строкеString[] токены = line.split(",");//Проверка токеновSystem.out.println(Arrays.toString(токены));}}поймать(IOException e) {e.printStackTrace();}

5. Заключение

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

Исходный код Скачать

Прокрутить вверх