Файл 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, которые очень просты в использовании и легко настраиваются.