Чтение CSV-файла на Java с использованием OpenCSV

Опубликовано: 13 Июля, 2021

Файл со значениями, разделенными запятыми (CSV) - это обычный текстовый файл, в котором данные хранятся по столбцу за столбцом и разделены разделителем (например, обычно это запятая «,»).

OpenCSV - это библиотека парсера CSV для Java. OpenCSV поддерживает все основные операции типа CSV, которые вы хотите выполнить. Java 7 в настоящее время является минимальной поддерживаемой версией для OpenCSV. Язык Java не обеспечивает встроенной поддержки для эффективной обработки файлов CSV, поэтому мы используем OpenCSV для обработки файлов CSV в Java.

Как использовать OpenCSV

  1. Для проекта maven вы можете включить зависимость OpenCSV maven в файл pom.xml.




    < dependency >
    < groupId >com.opencsv</ groupId >
    < artifactId >opencsv</ artifactId >
    < version >4.1</ version >
    </ dependency >
  2. Для Gradle Project вы можете включить зависимость OpenCSV.
     группа компиляции: 'com.opencsv', имя: 'opencsv', версия: '4.1'
  3. Вы можете скачать OpenCSV Jar и включить его в путь класса вашего проекта.

Некоторые полезные классы opencsv

  1. CSVReader - этот класс обеспечивает операции для чтения файла CSV в виде списка массива String.
  2. CSVWriter - этот класс позволяет нам записывать данные в файл CSV.
  3. CsvToBean - этот класс будет использоваться, когда вы хотите заполнить Java-бины из содержимого файла CSV.
  4. BeanToCsv - этот класс помогает экспортировать данные в файл CSV из вашего Java-приложения.

Чтение файла CSV

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

имя, rollno, отдел, результат, cgpa
амар, 42, cse, пасс, 8.6
rohini, 21, ece, неуспешно, 3,2
aman, 23, cse, пас, 8.9
рахул, 45, ее, провал, 4.6
Pratik, 65, cse, pass, 7.2
раунак, 23, я, пас, 9.1
сувам, 68, я, пас, 8.2

Мы можем прочитать CSV-файл двумя способами:

  1. Чтение данных построчно: давайте посмотрим, как построчно читать CSV-файл. Для чтения данных построчно, сначала мы должны создать и инициализировать объект CSVReader, передав объект чтения файла CSV-файла. После этого мы должны вызвать метод readNext () объекта CSVReader для чтения данных построчно, как показано в приведенном ниже коде.




    // Java code to illustrate reading a
    // CSV file line by line
    public static void readDataLineByLine(String file)
    {
    try {
    // Create an object of filereader
    // class with CSV file as a parameter.
    FileReader filereader = new FileReader(file);
    // create csvReader object passing
    // file reader as a parameter
    CSVReader csvReader = new CSVReader(filereader);
    String[] nextRecord;
    // we are going to read data line by line
    while ((nextRecord = csvReader.readNext()) != null ) {
    for (String cell : nextRecord) {
    System.out.print(cell + " " );
    }
    System.out.println();
    }
    }
    catch (Exception e) {
    e.printStackTrace();
    }
    }
  2. Прочитать все данные сразу: мы читаем записи CSV одну за другой, используя метод readNext (). CSVReader также предоставляет метод readAll () для чтения всех записей сразу в список.
     Список allData = csvReader.readAll ();

    Когда мы читаем файл csv по умолчанию, заголовок не игнорируется, как показано в выводе приведенных выше кодов. Когда нам нужно пропустить первый элемент в списке, мы можем указать начальную строку при создании CSVReader.

    CSVReader csvReader = 
    новый CSVReaderBuilder (читатель) .withSkipLines (1) .build ();

    Код:




    // Java code to illustrate reading a
    // all data at once
    public static void readAllDataAtOnce(String file)
    {
    try {
    // Create an object of file reader
    // class with CSV file as a parameter.
    FileReader filereader = new FileReader(file);
    // create csvReader object and skip first Line
    CSVReader csvReader = new CSVReaderBuilder(filereader)
    .withSkipLines( 1 )
    .build();
    List<String[]> allData = csvReader.readAll();
    // print Data
    for (String[] row : allData) {
    for (String cell : row) {
    System.out.print(cell + " " );
    }
    System.out.println();
    }
    }
    catch (Exception e) {
    e.printStackTrace();
    }
    }

Чтение CSV-файла с другим разделителем

Файлы CSV могут быть разделены разделителем, отличным от запятой, например, точка с запятой, вертикальная черта и т. Д. В следующем примере показано, как читать данные файла CSV, разделенные точкой с запятой.
Пример файла CSV, разделенного точкой с запятой:

имя; роллно; отдел; результат; cgpa
amar; 42; cse; pass; 8,6
rohini; 21; ece; неуспешно; 3,2
aman; 23; cse; pass; 8.9
rahul; 45; ee; fail; 4.6
pratik; 65; cse; pass; 7.2
раунак; 23; мне; пройти; 9,1
сувам; 68; мне; пройти; 8,2

Для пользовательского разделителя создается первый CSVParser с определенным символом парсера.

 CSVParser parser = новый CSVParserBuilder (). WithSeparator (';'). Build ();

Затем мы создадим объект CSVReader с помощью метода CSVParser () вместе с конструктором и предоставим созданный объект парсера параметру метода withCSVParser. При последнем вызове метода сборки для создания объекта.

 CSVReader csvReader = новый CSVReaderBuilder (читатель файлов) .withCSVParser (парсер) .build ();

Код:




// Java code to illustrate
// Reading CSV File with different separator
public static void readDataFromCustomSeperator(String file)
{
try {
// Create an object of file reader class with CSV file as a parameter.
FileReader filereader = new FileReader(file);
// create csvParser object with
// custom seperator semi-colon
CSVParser parser = new CSVParserBuilder().withSeparator( ';' ).build();
// create csvReader object with parameter
// filereader and parser
CSVReader csvReader = new CSVReaderBuilder(filereader)
.withCSVParser(parser)
.build();
// Read all data at once
List<String[]> allData = csvReader.readAll();
// Print Data.
for (String[] row : allData) {
for (String cell : row) {
System.out.print(cell + " " );
}
System.out.println();
}
}
catch (Exception e) {
e.printStackTrace();
}
}

Пример - чтение двух файлов csv result.csv и results_semicolon_Seperator.csv
result.csv имеет разделитель по умолчанию ',' но results_semicolon_Seperator.csv имеет разделитель ';' на месте ', '.
Коды:




// Java program to illustrate reading
// two CSV files
// with different seperators
import java.io.FileReader;
import java.util.List;
import com.opencsv.*;
public class ReadCSVData {
private static final String CSV_FILE_PATH
= "D:\EclipseWorkSpace\CSVOperations\results.csv" ;
private static final String CSV_FILE_CUSTOM_SEPERATOR
= "D:\EclipseWorkSpace\CSVOperations\results_semicolon_Seperator.csv" ;
public static void main(String[] args)
{
System.out.println( "Read Data Line by Line With Header " );
readDataLineByLine(CSV_FILE_PATH);
System.out.println( "_______________________________________________" );
System.out.println( "Read All Data at Once and Hide the Header also " );
readAllDataAtOnce(CSV_FILE_PATH);
System.out.println( "_______________________________________________" );
System.out.println( "Custom Seperator here semi-colon " );
readDataFromCustomSeperator(CSV_FILE_CUSTOM_SEPERATOR);
System.out.println( "_______________________________________________" );
}
public static void readDataLineByLine(String file)
{
try {
// Create an object of filereader class
// with CSV file as a parameter.
FileReader filereader = new FileReader(file);
// create csvReader object passing
// filereader as parameter
CSVReader csvReader = new CSVReader(filereader);
String[] nextRecord;
// we are going to read data line by line
while ((nextRecord = csvReader.readNext()) != null ) {
for (String cell : nextRecord) {
System.out.print(cell + " " );
}
System.out.println();
}
}
catch (Exception e) {
e.printStackTrace();
}
}
public static void readAllDataAtOnce(String file)
{
try {
// Create an object of filereader class
// with CSV file as a parameter.
FileReader filereader = new FileReader(file);
// create csvReader object
// and skip first Line
CSVReader csvReader = new CSVReaderBuilder(filereader)
.withSkipLines( 1 )
.build();
List<String[]> allData = csvReader.readAll();
// print Data
for (String[] row : allData) {
for (String cell : row) {
System.out.print(cell + " " );
}
System.out.println();
}
}
catch (Exception e) {
e.printStackTrace();
}
}
public static void readDataFromCustomSeperator(String file)
{
try {
// Create object of filereader
// class with csv file as parameter.
FileReader filereader = new FileReader(file);
// create csvParser object with
// custom seperator semi-colon
CSVParser parser = new CSVParserBuilder().withSeparator( ';' ).build();
// create csvReader object with
// parameter filereader and parser
CSVReader csvReader = new CSVReaderBuilder(filereader)
.withCSVParser(parser)
.build();
// Read all data at once
List<String[]> allData = csvReader.readAll();
// print Data
for (String[] row : allData) {
for (String cell : row) {
System.out.print(cell + " " );
}
System.out.println();
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}

Выход:

_______________________________________________
Прочитать данные строка за строкой с заголовком 

имя роллно отдел результат cgpa    
amar 42 cse pass 8.6    
rohini 21 ece сбой 3,2    
aman 23 cse pass 8.9    
rahul 45 ee фейл 4.6    
Pratik 65 cse pass 7.2    
раунак 23 мне пройти 9.1    
сувам 68 мне пройти 8,2    
_______________________________________________
Прочитать все данные сразу и также скрыть заголовок 

amar 42 cse pass 8.6    
rohini 21 ece сбой 3,2    
aman 23 cse pass 8.9    
rahul 45 ee фейл 4.6    
Pratik 65 cse pass 7.2    
раунак 23 мой пас 9.1    
сувам 68 мне пройти 8,2    
_______________________________________________
Пользовательский разделитель здесь точка с запятой

имя роллно отдел результат cgpa    
amar 42 cse pass 8.6    
rohini 21 ece сбой 3,2    
aman 23 cse pass 8.9    
rahul 45 ee фейл 4.6    
Pratik 65 cse pass 7.2    
раунак 23 мне пройти 9.1    
сувам 68 мне пройти 8,2    
_______________________________________________

В будущие статьи мы добавим больше операций с CSV-файлом с помощью OpenCSV.
Ссылки: Документация по классу CSVReader, Документация OpenCSV.

Вниманию читателя! Не прекращайте учиться сейчас. Ознакомьтесь со всеми важными концепциями Java Foundation и коллекций с помощью курса "Основы Java и Java Collections" по приемлемой для студентов цене и будьте готовы к работе в отрасли. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .