Java中的读写CSV文件 之 OpenCSV教程

CSV代表“ 逗号分隔值 ”。CSV文件通常用于创建数据文件以导出数据或导入数据。Java语言不提供任何本机支持来有效处理CSV文件。如果不使用第三方库,我们最终可能会创建自己的CSV解析器。重新发明轮子通常没有任何好处,因此建议使用此类第三方工具来解析CSV文件。

OpenCSV是一种工具,可用于读取Java中的csv文件将数据写入CSV文件

目录

1。 OpenCSV maven依赖项
2。 OpenCSV通用类
3.读取CSV文件
4.编写新的CSV文件
5.追加到现有的CSV文件
6.自定义CSV文件的分隔符
7.将CSV读取到Java bean 
8.从中创建CSV SQL数据

1。 OpenCSV Maven依赖项

如果我们正在从事Maven项目,则可以在pom.xml如下文件中包含OpenCSV maven依赖项。

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

如果您不使用maven项目,则可以从http://sourceforge.net/projects/opencsv/下载二进制文件/ jar。

2。 OpenCSV通用类

以下是我们应该经历的最常用的OpenCSV类的列表。

  • CSVParser:根据商业友好许可发布的非常简单的CSV解析器。这只是实现将单行拆分为多个字段。
  • CSVReader:从Java应用程序代码读取CSV文件时,大多数时候都会使用此类。此类提供了许多有用的构造函数,以使用不同的选项和功能来构建CSVReader。例如,您可以提供一个不同的分隔符(逗号默认),一个不同的引号字符(默认为双引号),甚至还可以提供从解析开始的起始行号。
  • CSVWriter:CSVWriter也非常可自定义,就像CSVReader。使用Java应用程序代码编写CSV文件时,可以使用自定义分隔符,自定义引号字符或自定义行终止符。
  • CsvToBean:当您要从CSV文件内容填充Java Bean时,将使用此类。您将在下面看到一个示例。
  • BeanToCsv:如果要从Java应用程序将数据导出到CSV文件,则可能也需要此类的帮助。
  • ColumnPositionMappingStrategy:如果计划使用CsvToBean(或BeanToCsv)导入CSV数据,则将使用此类将CSV字段映射到Java bean字段。

3.如何读取CSV文件

3.1。逐行读取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));
         }
       }
   }
}

3.2。读取完整的CSV文件并逐行迭代

上面的示例逐行读取CSV文件并打印到控制台。我们可以读取一次完整的CSV文件,然后根据需要遍历数据。以下是使用readAll()方法读取的构建CSV数据示例。

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文件,然后逐行遍历行。

4.如何编写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();
   }
}

5.如何附加到现有的CSV文件

上面的示例创建了一个新的CSV文件,并从头开始,即行号0开始写入数据。很多时候,我们希望将数据追加到现有的CSV文件中,而不是写入新文件。我们可以通过向FileWriter实例传递第二个参数来实现此功能。

没有直接支持在OpenCSV库中追加。

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();
   }
}

6。 CSV文件的自定义分隔符

可以在CSVReader或的构造函数中指定自定义分隔符CSVWriter。让我们看一个例子。我已将默认分隔符从逗号更改为分号

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));
     }
   }
}

7.读取CSV到Java bean

OpenCSV还提供了将CSV文件直接读取到Java bean的功能。让我们为它建立一个简单的例子。

7.1。CSV文件

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

7.2。Java Bean

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;
   
   //Getters and setters
   
   @Override
   public String toString()
   {
      return "Employee [id=" + id + ", firstName=" + firstName + ", 
				lastName=" + lastName + ", country=" + country + ", age=" + age + "]";
   }
}

7.3。读取CSV到Java bean

下面的示例读取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;
   }
}

程序输出。

Employee [id=1, firstName=Lokesh, lastName=Gupta, country=India, age=32]
Employee [id=2, firstName=David, lastName=Miller, country=England, age=34]

8.从SQL数据创建CSV

现在,这也是我们在应用程序中需要的一项期望的活动。为了将数据直接从SQL表导出到CSV文件,我们将需要该ResultSet对象。可以使用以下API通过ResultSet使用获得的ResultSet引用将数据写入CSV 。

java.sql.ResultSet myResultSet = getResultSetFromSomewhere();

writer.writeAll(myResultSet, includeHeaders); //writer is instance of CSVWriter

在上述方法中,第一个参数是ResultSet我们要写入CSV文件的参数。第二个参数是boolean表示是否要将标题列(表列名称)写入文件。

这一切都是为了解释OpenCSV库从Java应用程序代码读取和写入CSV文件基本用法。在评论部分分享您的想法和疑问。

阅读更多 :

如何在Java中读取写入Excel文件– Apache POI教程
–使用Java创建PDF文件– iText教程

参考文献:

http://mvnrepository.com/artifact/net.sf.opencsv/opencsv
http://opencsv.sourceforge.net/apidocs/index.html

saigon has written 1445 articles

Leave a Reply