期中考答案:使用OpenCSV 在Java 中讀取CSV 文件

期中考答案:使用OpenCSV 在Java 中讀取CSV 文件

four bots

Comma-Separated Values (CSV) 文件只是一個普通的純文本文件,按列存儲數據,並用分隔符分隔(例如通常是逗號“,”)。

OpenCSV 是Java 的CSV 解析器庫。OpenCSV 支持您想要執行的所有基本CSV 類型操作。Java 7 目前是OpenCSV 支持的最低版本。Java 語言不提供任何有效處理CSV 文件的本機支持,因此我們使用OpenCSV 在Java 中處理CSV 文件。

如何使用OpenCSV

1. 對於maven項目,你可以在pom.xml文件中包含OpenCSV maven依賴。

<dependency>
    <groupId>com.opencsv</groupId>
    <artifactId>opencsv</artifactId>
    <version>4.1</version>
</dependency>

2. 對於Gradle 項目,可以包含OpenCSV 依屬項目。

compile group: 'com.opencsv', name: 'opencsv', version: '4.1'

3. 下載OpenCSV Jar 並將其包含項目類路徑中。

常用OpenCSV 類型:

  1. CSVReader:此類提供將CSV 文件讀取為字符串數組列表的操作。
  2. CSVWriter :這個類允許我們將數據寫入CSV 文件。
  3. CsvToBean:從CSV 文件內容填充java bean 時,將使用這個類。
  4. BeanToCsv:此類有助於將數據從Java 應用程序導出到CSV 文件。

讀取CSV 文件

要讀取CSV 文件,需要 CSVReader 類。以下提供CSV 文件。

name, rollno, department, result, cgpa
amar, 42, cse, pass, 8.6
rohini, 21, ece, fail, 3.2
aman, 23, cse, pass, 8.9
rahul, 45, ee, fail, 4.6
pratik, 65, cse, pass, 7.2
raunak, 23, me, pass, 9.1
suvam, 68, me, pass, 8.2

> 兩種方式讀取csv 文件:

1. 逐行讀取數據:讓我們看看如何逐行讀取CSV 文件。為了逐行讀取數據,首先我們必須通過傳遞CSV 文件的filereader 對象來構造和初始化CSVReader 對象。之後我們必須調用CSVReader 對象的readNext() 方法來逐行讀取數據,如下面的代碼所示。

// 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 + "\t");
			}
			System.out.println();
		}
	}
	catch (Exception e) {
		e.printStackTrace();
	}
}

2. 一次讀取所有數據:使用readNext() 方法一條一條地讀取CSV 記錄。CSVReader 還提供了一個名為readAll() 的方法,可以一次將所有記錄讀取到一個列表中。

List allData = csvReader.readAll(); 

讀取csv 文件時,header 不會被忽略,如上面代碼的輸出所示。當我們需要跳過列表中的第一個元素時,我們可以在創建CSVReader 時指定起始行。

CSVReader csvReader = 
new CSVReaderBuilder(reader).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 + "\t");
			}
			System.out.println();
		}
	}
	catch (Exception e) {
		e.printStackTrace();
	}
}

使用不同的分隔符號讀取CSV 文件

CSV 文件可以用逗號以外的自訂分隔符號,例如分號、豎線等。以下示例說明如何讀取由分號字符分隔的CSV 文件。

分號符號的CSV 文件示例:

name;rollno;department;result;cgpa
amar;42;cse;pass;8.6
rohini;21;ece;fail;3.2
aman;23;cse;pass;8.9
rahul;45;ee;fail;4.6
pratik;65;cse;pass;7.2
raunak;23;me;pass;9.1
suvam;68;me;pass;8.2

對於自定義分隔符,首先創建具有特定解析器字符的 CSVParser。

CSVParser parser = new CSVParserBuilder().withSeparator(';').build();

然後我們將創建CSVReader 對象withCSVParser() 方法以及構造函數,並將生成的解析器對象提供給withCSVParser 方法的參數。最後調用build 方法來構建對象。

CSVReader csvReader = new CSVReaderBuilder(filereader).withCSVParser(parser).build();
// Java code to illustrate
// Reading CSV File with different separator
public static void readDataFromCustomSeparator(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 separator 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 + "\t");
			}
			System.out.println();
		}
	}
	catch (Exception e) {
		e.printStackTrace();
	}
}

讀取兩個csv 文件result.csv 和result_semicolon_Separator.csv
result.csv 具有默認分隔符“,”,但 results_semicolon_Separator.csv 具有分隔符“;” 代替’,’。

// Java program to illustrate reading
// two CSV files
// with different separators

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_SEPARATOR
		= "D:\\EclipseWorkSpace\\CSVOperations\\results_semicolon_Separator.csv";

	public static void main(String[] args)
	{

		System.out.println("Read Data Line by Line With Header \n");
		readDataLineByLine(CSV_FILE_PATH);
		System.out.println("_______________________________________________");

		System.out.println("Read All Data at Once and Hide the Header also \n");
		readAllDataAtOnce(CSV_FILE_PATH);
		System.out.println("_______________________________________________");

		System.out.println("Custom Separator here semi-colon\n");
		readDataFromCustomSeparator(CSV_FILE_CUSTOM_SEPARATOR);
		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 + "\t");
				}
				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 + "\t");
				}
				System.out.println();
			}
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void readDataFromCustomSeparator(String file)
	{
		try {
			// Create object of filereader
			// class with csv file as parameter.
			FileReader filereader = new FileReader(file);

			// create csvParser object with
			// custom separator 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 + "\t");
				}
				System.out.println();
			}
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}
}

OUTPUT:

_______________________________________________
Read Data Line by Line With Header 

name    rollno    department    result    cgpa    
amar    42    cse    pass    8.6    
rohini    21    ece    fail    3.2    
aman    23    cse    pass    8.9    
rahul    45    ee    fail    4.6    
pratik    65    cse    pass    7.2    
raunak    23    me    pass    9.1    
suvam    68    me    pass    8.2    
_______________________________________________
Read All Data at Once and Hide the Header also 

amar    42    cse    pass    8.6    
rohini    21    ece    fail    3.2    
aman    23    cse    pass    8.9    
rahul    45    ee    fail    4.6    
pratik    65    cse    pass    7.2    
raunak    23    me    pass    9.1    
suvam    68    me    pass    8.2    
_______________________________________________
Custom Separator here semi-colon

name    rollno    department    result    cgpa    
amar    42    cse    pass    8.6    
rohini    21    ece    fail    3.2    
aman    23    cse    pass    8.9    
rahul    45    ee    fail    4.6    
pratik    65    cse    pass    7.2    
raunak    23    me    pass    9.1    
suvam    68    me    pass    8.2