Работаем с файлами CSV в Java с использованием библиотеки OpenCSV — TechCave

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

Работаем с файлами CSV в Java с использованием библиотеки OpenCSV

JAVA

Работаем с файлами CSV в Java с использованием библиотеки OpenCSV

CSV означает « comma-separated values (значения, разделенные запятыми)». Файлы CSV в основном используются для создания файлов данных, либо для экспорта данных, либо для импорта данных. Язык Java не предоставляет никакой собственной поддержки для эффективной обработки файлов CSV и без использования сторонних библиотек, вы в конечном итоге создаете свой собственный синтаксический анализатор CSV. Поэтому рекомендуется использовать сторонние инструменты для разбора CSV-файлов.

OpenCSV — это такой инструмент, который является очень простой библиотекой парсеров CSV для Java. OpenCSV поддерживает все основные вещи для работы с csv, которые вам могут понадобиться. И некоторые из них мы рассмотрим в этом уроке.

В этом посте мы рассмотрим наиболее распространенные действия, которые вам могут понадобятся в реальных приложениях.

Зависимости OpenCSV

Если вы работаете над проектом с помощью maven, вы можете включить зависимость maven для OpenCSV в файле pom.xml, как показано ниже:

<dependency>
    <groupId>net.sf.opencsv</groupId>
    <artifactId>opencsv</artifactId>
    <version>2.3</version>
</dependency>

Также вы можете загрузить jar-файлы из http://sourceforge.net/projects/opencsv/, если вы не используете maven.

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

Ниже приведен список наиболее используемых классов OpenCSV, которые вы должны изучить:

  • CSVParser: очень простой CSV-парсер. Он просто реализует разделение одной строки на поля.
  • CSVReader: вы будете использовать этот класс большую часть времени, читая CSV-файл из вашего Java-кода. Этот класс предоставляет ряд полезных конструкторов для создания CSVReader с различными параметрами и возможностями. Например, Вы можете указать другой разделительный символ (по умолчанию это запятая), другой символ кавычки (по умолчанию — двойная кавычка), и даже вы можете указать номер начальной строки, с которой должен начинаться синтаксический анализ.
  • CSVWriter: CSVWriter также очень настраиваемый класс, как и CSVReader. Вы можете использовать пользовательский разделитель, свои кавычки и т. д.
  • CsvToBean: этот класс будет использоваться, если вы хотите заполнить свои java-компоненты из содержимого файла CSV. Ниже вы увидите пример.
  • BeanToCsv: Если вы хотите экспортировать данные в CSV-файл из приложения Java, вам может понадобиться помощь этого класса.
  • ColumnPositionMappingStrategy: если вы планируете использовать CsvToBean (или BeanToCsv) для импорта CSV-данных, то вы будете использовать этот класс для сопоставления полей CSV с полями java bean.

Чтение и парсинг CSV-файла

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

import java.io.FileReader;
import java.util.Arrays;
import au.com.bytecode.opencsv.CSVReader;
public class ParseCSVLineByLine
{
   @SuppressWarnings("resource")
   public static void main(String[] args) throws Exception
   {
      //Build reader instance
      //Read data.csv
      //Default seperator is comma
      //Default quote character is double quote
      //Start reading from line number 2 (line numbers start from zero)
      CSVReader reader = new CSVReader(new FileReader("data.csv"), ',' , '"' , 1);
      //Read CSV line by line and use the string array as you want
      String[] nextLine;
      while ((nextLine = reader.readNext()) != null) {
         if (nextLine != null) {
            //Verifying the read data here
            System.out.println(Arrays.toString(nextLine));
         }
       }
   }
}

Вышеприведенный пример читает файл CSV по одной строке и печатает в консоль. Вы можете прочитать весь CSV-файл за один раз, а затем перебрать данные по своему усмотрению. Ниже приведен пример чтения CSV-данных с использованием метода readAll ().

import java.io.FileReader;
import java.util.Arrays;
import java.util.List;
import au.com.bytecode.opencsv.CSVReader;
public class ParseFullCSVExample
{
   @SuppressWarnings("resource")
   public static void main(String[] args) throws Exception
   {
      //Build reader instance
      CSVReader reader = new CSVReader(new FileReader("data.csv"), ',', '"', 1);
      //Read all rows at once
      List<String[]> allRows = reader.readAll();
      //Read CSV line by line and use the string array as you want
     for(String[] row : allRows){
        System.out.println(Arrays.toString(row));
     }
   }
}

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

Создание нового CSV-файла

Создание CSV-файла так же просто, как и чтение. Создайте экземпляр CSVWriter с соответствующими параметрами конфигурации и начните записывать данные в файл CSV. Давайте посмотрим это на примере.

import java.io.FileWriter;
import au.com.bytecode.opencsv.CSVWriter;
public class WritingCSVFileExample
{
   public static void main(String[] args) throws Exception
   {
      String csv = "data.csv";
      CSVWriter writer = new CSVWriter(new FileWriter(csv));
      //Create record
      String [] record = "4,David,Miller,Australia,30".split(",");
      //Write the record to file
      writer.writeNext(record);
      //close the writer
      writer.close();
   }
}

Добавление к уже существующему CSV-файлу

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

import java.io.FileWriter;
import au.com.bytecode.opencsv.CSVWriter;
public class AppendToCSVExample
{
   public static void main(String[] args) throws Exception
   {
      String csv = "data.csv";
      CSVWriter writer = new CSVWriter(new FileWriter(csv, true));
      String [] record = "3,David,Feezor,USA,40".split(",");
      writer.writeNext(record);
      writer.close();
   }
}

Использование пользовательского разделителя для файлов CSV

Пользовательский разделитель может быть указан в конструкторе CSVReader или CSVWriter. Давайте посмотрим на пример. Я изменил разделитель по умолчанию c запятой на точку с запятой.

import java.io.FileReader;
import java.util.Arrays;
import java.util.List;
import au.com.bytecode.opencsv.CSVReader;
public class CustomSeperatorExample
{
   @SuppressWarnings("resource")
   public static void main(String[] args) throws Exception
   {
      //Build reader instance
      CSVReader reader = new CSVReader(new FileReader("data.csv"), ';', '"', 1);
      //Read all rows at once
      List<String[]> allRows = reader.readAll();
      //Read CSV line by line and use the string array as you want
     for(String[] row : allRows){
        System.out.println(Arrays.toString(row));
     }
   }
}

Связывание CSV с java beans

OpenCSV также предоставляет функциональные возможности для сопоставления CSV-файла со списком Java bean компонентов. Давайте построим для этого небольшой пример.

data.csv

1,Lokesh,Gupta,India,32
2,David,Miller,England,34

Employee.java

public class Employee implements Serializable
{
   private static final long serialVersionUID = 1L;
   private String id;
   private String firstName;
   private String lastName;
   private String country;
   private String age;
   public String getId()
   {
      return id;
   }
   public void setId(String id)
   {
      this.id = id;
   }
   public String getFirstName()
   {
      return firstName;
   }
   public void setFirstName(String firstName)
   {
      this.firstName = firstName;
   }
   public String getLastName()
   {
      return lastName;
   }
   public void setLastName(String lastName)
   {
      this.lastName = lastName;
   }
   public String getCountry()
   {
      return country;
   }
   public void setCountry(String country)
   {
      this.country = country;
   }
   public String getAge()
   {
      return age;
   }
   public void setAge(String age)
   {
      this.age = age;
   }
   @Override
   public String toString()
   {
      return "Employee [id=" + id + ", firstName=" + firstName + ", 
                lastName=" + lastName + ", country=" + country + ", age=" + age + "]";
   }
}

CSVMappedToJavaBeanExample.java

Ниже пример читает файл data.csv и заполняет экземпляры Employee.java. Затем он проверяет данные, распечатывая их в консоли.

import java.io.FileReader;
import java.util.List;
import au.com.bytecode.opencsv.CSVReader;
import au.com.bytecode.opencsv.bean.ColumnPositionMappingStrategy;
import au.com.bytecode.opencsv.bean.CsvToBean;
public class CSVMappedToJavaBeanExample
{
   @SuppressWarnings({"rawtypes", "unchecked"})
   public static void main(String[] args) throws Exception
   {
      CsvToBean csv = new CsvToBean();
      String csvFilename = "data.csv";
      CSVReader csvReader = new CSVReader(new FileReader(csvFilename));
      //Set column mapping strategy
      List list = csv.parse(setColumMapping(), csvReader);
      for (Object object : list) {
          Employee employee = (Employee) object;
          System.out.println(employee);
      }
   }
   @SuppressWarnings({"rawtypes", "unchecked"})
   private static ColumnPositionMappingStrategy setColumMapping()
   {
      ColumnPositionMappingStrategy strategy = new ColumnPositionMappingStrategy();
      strategy.setType(Employee.class);
      String[] columns = new String[] {"id", "firstName", "lastName", "country", "age"}; 
      strategy.setColumnMapping(columns);
      return strategy;
   }
}
Output:
Employee [id=1, firstName=Lokesh, lastName=Gupta, country=India, age=32]
Employee [id=2, firstName=David, lastName=Miller, country=England, age=34]

Создание CSV из SQL-данных

Для экспорта данных непосредственно из таблиц SQL в CSV-файл нам понадобится объект ResultSet. Следующий API может использоваться для записи данных в CSV из ResultSet.

java.sql.ResultSet myResultSet = getResultSetFromSomewhere();
writer.writeAll(myResultSet, includeHeaders); //writer is instance of CSVWriter

В вышеприведенном методе первым аргументом является ResultSet, который вы хотите записать в файл CSV. Второй аргумент — boolean, означающий, хотите ли вы писать столбцы заголовков (имена столбцов таблицы) в файл или нет.

Вот мы и рассмотрели основные действия с CSV-файлом из Java-кода. Всем удачи.

09:36
3262
Den

Нет комментариев. Ваш будет первым!

Авторизация

Пользователи

Георгiй Москвитинъ
Andpyxa Tutunnik
Andrey_fox
Jane linch
genagy
Pasha Radiuk
KotikBSD
Эрик Имашев
Амир Исмагилов