1. 程式人生 > >Java Read CSV File In Java With OpenCSV library 以及中檔案亂碼解決, Mapping CSV with Java beans

Java Read CSV File In Java With OpenCSV library 以及中檔案亂碼解決, Mapping CSV with Java beans

sample.csv檔案:

COUNTRY,CAPITAL,POPULATION
India,New Delhi, 1.21B
People's republic of China,Beijing, 1.34B
United States,Washington D.C., 0.31B
一.使用readNext()方法一行一行讀CSV檔案,返回字串陣列
package com.jiangge.csv.opencsvtest;

import java.io.FileReader;
import java.io.IOException;

import au.com.bytecode.opencsv.CSVReader;

//COUNTRY,CAPITAL,POPULATION
//India,New Delhi, 1.21B
//People's republic of China,Beijing, 1.34B
//United States,Washington D.C., 0.31B

/**
 * use readNext() method of CSVReader class to read CSV file line by line. 
 * It returns a String array for each value in row.
 */
public class ReadLineByLine {
	public static void main(String[] args) throws IOException {
		String csvFilename = "C:\\sample.csv";
		CSVReader csvReader = new CSVReader(new FileReader(csvFilename));
		String[] row = null;
		while((row = csvReader.readNext()) != null) {
		    System.out.println(row[0] + " # " + row[1] + " #  " + row[2]);
		}
		//...
		csvReader.close();
	}
}

輸出結果:
COUNTRY # CAPITAL #  POPULATION
India # New Delhi #   1.21B
People's republic of China # Beijing #   1.34B
United States # Washington D.C. #   0.31B
二 使用 readAll()方法一次讀取整個CSV檔案,返回 List
package com.jiangge.csv.opencsvtest;

import java.io.FileReader;
import java.io.IOException;
import java.util.List;

import au.com.bytecode.opencsv.CSVReader;

//COUNTRY,CAPITAL,POPULATION
//India,New Delhi, 1.21B
//People's republic of China,Beijing, 1.34B
//United States,Washington D.C., 0.31B


/**
 * read full CSV file once. The readAll() method of CSVReader class comes handy for this.
 * The readAll() method returns a List of String[] for given CSV file.
 * @author jiangge
 */
public class ReadAllTest {
	public static void main(String[] args) throws IOException {
		String[] row = null;
		String csvFilename = "C:\\sample.csv";
		 
		CSVReader csvReader = new CSVReader(new FileReader(csvFilename));
		List content = csvReader.readAll();
		 
		for (Object object : content) {
		    row = (String[]) object;
		    System.out.println(row[0] + " # " + row[1]+ " #  " + row[2]);
		}
		//...
		csvReader.close();
	}
}

輸出結果:
COUNTRY # CAPITAL #  POPULATION
India # New Delhi #   1.21B
People's republic of China # Beijing #   1.34B
United States # Washington D.C. #   0.31B


三. 使用其他的分隔符號, 和跳過某些行--具體解釋看這裡:點選開啟連結

CSVReader reader = new CSVReader(new FileReader(file), ';')
CSVReader reader = new CSVReader(new FileReader(file), '#')

跳過前5行,從第6行開始:

CSVReader reader = new CSVReader(new FileReader(file), ',', '\'', 5);

 
四.Mapping CSV with Java beans

1.java bean

package com.jiangge.csv.opencsvtest;

public class Country {
	private String countryName;
	private String capital;
	private String population;
	
	public String getPopulation() {
		return population;
	}
	public void setPopulation(String population) {
		this.population = population;
	}
	public String getCountryName() {
		return countryName;
	}
	public void setCountryName(String countryName) {
		this.countryName = countryName;
	}
	public String getCapital() {
		return capital;
	}
	public void setCapital(String capital) {
		this.capital = capital;
	}

}
2.關聯JavaBean,Now we can map this bean with Opencsv and read the CSV file
package com.jiangge.csv.opencsvtest;

import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.util.List;

import au.com.bytecode.opencsv.CSVReader;
import au.com.bytecode.opencsv.bean.ColumnPositionMappingStrategy;
import au.com.bytecode.opencsv.bean.CsvToBean;




//COUNTRY,CAPITAL,POPULATION
//India,New Delhi, 1.21B
//People's republic of China,Beijing, 1.34B
//United States,Washington D.C., 0.31B

/**
 * map this bean(Country.java) with Opencsv and read the CSV file. Check out below example:
 * @author jiangge
 */
public class JavaBeanMapWithCSV {

	public static void main(String[] args) throws FileNotFoundException {
		ColumnPositionMappingStrategy strategy = new ColumnPositionMappingStrategy();
		
		strategy.setType(Country.class); // 關聯JavaBean
		String[] columns = new String[] {"countryName", "capital"}; // the fields to bind do in your JavaBean,JavaBean裡的類變數屬性
		strategy.setColumnMapping(columns);
		CsvToBean csv = new CsvToBean();
		
		String csvFilename = "C:\\sample.csv";
		CSVReader csvReader = new CSVReader(new FileReader(csvFilename));
		
//    	DataInputStream in = new DataInputStream(new FileInputStream(new File(csvFilename)));
//        csvReader = new CSVReader(new InputStreamReader(in,"utf-8"),',', '\'', 1); //這兩行註釋掉的內容可以解決中文亂碼問題
        
		List list = csv.parse(strategy, csvReader);
		for (Object object : list) {
			Country country = (Country) object;
			System.out.println(country.getCapital());
		}
	}
}

輸出結果:

CAPITAL
New Delhi
Beijing
Washington D.C.


OpenCSV library中文亂碼解決方法:
DataInputStream in = new DataInputStream(new FileInputStream(new File(csvFilename)));
csvReader = new CSVReader(new InputStreamReader(in,"utf-8"),',', '\'', 1); //這兩行註釋掉的內容可以解決中文亂碼問題

參考資料: