1. 程式人生 > >openCSV讀寫CSV檔案

openCSV讀寫CSV檔案

        openCSV是一款簡單的用於解析CSV檔案的java類庫,它封裝了CSV格式檔案的讀寫操作,可將檔案與java物件進行自動對映,自定義分隔符,使用轉義符等。

在使用時有幾點需要注意下:

        1、       生成的csv檔案用EXCEL開啟時,總是產生亂碼,但是用NOTEPAD++開啟時,顯示正常。這是因為匯出的檔案是UTF-8不含BOM格式編碼的,為了要讓EXCEL正確的顯示,需要手動的給將要輸出的內容加上BOM標識。

        2、       可通過@ CsvBindByName和@ CsvBindByPosition來CSV檔案欄位與物件屬性進行對映。@ CsvBindByName是根據表頭的名稱來對映;@

CsvBindByPosition是根據檔案中欄位的位置來對映。當2個註解一起使用時則基於位置的方式有效。因此如果寫檔案時即想指定順序又想加表頭的話需手動寫表頭。

        3、       在讀CSV檔案時需要注意BOM字元,因為在寫檔案時為了能在Excel裡開啟增加了UTF-8 BOM標識,讀檔案時第一列會讀不出來。這種情況的解決方法是使用apache commons io提供的BOMInputStream。

        程式碼示例如下

public class Person {

	private String name;

	private int age;

	private int sex;

	private String phone;

	private String address;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public int getSex() {
		return sex;
	}

	public void setSex(int sex) {
		this.sex = sex;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public String toString() {
		return ":"+name + ";" + age + ";" + sex + ";" + phone + ";" + address;
	}
}

public class WriteCSV {

	public void writeCSV2(List<Person> dataList, String finalPath) {
		try {
			Writer writer = new FileWriter(finalPath);
			// 手動加上BOM標識
			writer.write(new String(new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF }));

			// 設定顯示的順序
			String[] columnMapping = { "name", "age", "sex", "phone", "address" };
			ColumnPositionMappingStrategy<Person> mapper = 
					new ColumnPositionMappingStrategy<Person>();
			mapper.setType(Person.class);
			mapper.setColumnMapping(columnMapping);

			// 寫表頭
			CSVWriter csvWriter = new CSVWriter(writer, CSVWriter.DEFAULT_SEPARATOR,
					CSVWriter.NO_QUOTE_CHARACTER);
			String[] header = { "姓名", "年齡", "性別", "手機", "住址" };
			csvWriter.writeNext(header);

			StatefulBeanToCsv beanToCsv = new StatefulBeanToCsvBuilder(writer)
					.withMappingStrategy(mapper)
					.withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)
					.withSeparator(CSVWriter.DEFAULT_SEPARATOR)
					.withEscapechar('\\').build();
			beanToCsv.write(dataList);
			csvWriter.close();
			writer.close();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (CsvDataTypeMismatchException e) {
			e.printStackTrace();
		} catch (CsvRequiredFieldEmptyException e) {
			e.printStackTrace();
		}
		System.out.println(finalPath + "資料匯出成功");
	}

	public void readCSV2(String finalPath) {
		try {
			// 使用BOMInputStream自動去除UTF-8中的BOM
			Reader reader = new InputStreamReader(new BOMInputStream(
					new FileInputStream(finalPath)), "utf-8");
			CSVReader csvReader = new CSVReader(reader, CSVWriter.DEFAULT_SEPARATOR,
					CSVWriter.NO_QUOTE_CHARACTER);

			// 列名的對映
			HeaderColumnNameTranslateMappingStrategy<Person> strategy = 
					new HeaderColumnNameTranslateMappingStrategy<Person>();
			strategy.setType(Person.class);
			Map<String, String> columnMapping = new HashMap<String, String>();
			columnMapping.put("姓名", "name");
			columnMapping.put("年齡", "age");
			columnMapping.put("性別", "sex");
			columnMapping.put("手機", "phone");
			columnMapping.put("住址", "address");
			strategy.setColumnMapping(columnMapping);

			CsvToBean<Person> csvToBean = new CsvToBean<Person>();

			List<Person> list = csvToBean.parse(strategy, csvReader);

			for (Person p : list) {
				System.out.println(p.toString());
			}
			csvReader.close();
			reader.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		List<Person> dataList = new ArrayList<Person>();
		Person person1 = new Person();
		person1.setName("張三");
		person1.setSex(1);
		person1.setAge(55);
		person1.setPhone("13911111111");
		person1.setAddress("北京海淀區");
		dataList.add(person1);
		Person person2 = new Person();
		person2.setName("小美");
		person2.setSex(0);
		person2.setAge(20);
		person2.setPhone("13911112222");
		person2.setAddress("北京西城區");
		dataList.add(person2);
		Person person3 = new Person();
		person3.setName("小明");
		person3.setSex(1);
		person3.setAge(25);
		person3.setPhone("13933333333");
		person3.setAddress("北京海淀區");
		dataList.add(person3);

		WriteCSV writer = new WriteCSV();
		String finalPath2 = "D:/bbb.csv";
		writer.writeCSV2(dataList, finalPath2);
		writer.readCSV2(finalPath2);
	}
}




相關推薦

openCSVCSV檔案

        openCSV是一款簡單的用於解析CSV檔案的java類庫,它封裝了CSV格式檔案的讀寫操作,可將檔案與java物件進行自動對映,自定義分隔符,使用轉義符等。 在使用時有幾點需要注意下:         1、       生成的csv檔案用EXCEL開啟時,

STL 使用ofstream + ifstream csv檔案

csv檔案,每行的資料是用逗號分隔的,讀寫csv檔案的示例程式碼如下: #include "stdafx.h" #include <iostream> #include <string> #include <vector> #include <fst

pythoncsv檔案方法總結

python提供了大量的庫,可以非常方便的進行各種操作,現在把python中實現讀寫csv檔案的方法使用程式的方式呈現出來。 1、使用csv讀寫csv檔案方法總結 reader()函式是一個閱讀器把閱讀的CSV檔案每一行以一個列表表示出來以至於你可以用for迴圈來遍歷他 讀檔案的時候,開啟檔

Python.csv檔案

# encoding: UTF-8 import csv # 讀取csv檔案 stocks_list = [] #方式一 # file = open(u'../Output.csv', u"r") # data = csv.reader(file) # 返回的是迭代型別 #方式二 with

支援各種特殊字元的 CSV 解析類 (.net 實現)(C#CSV檔案)

CSV是一種十分簡潔的資料結構,在DOTNET平臺實際使用中發現微軟官方並沒有提供預設的方法,而網上好多例子發現實現並不嚴謹甚至一些含有明顯錯誤,所以後面自己實現了一個讀寫工具類,這裡發出來希望方便後面朋友(難免還是會有考慮不到的地方,可隨時郵件聯絡) 使用該工具可對csv檔案進行讀寫(甚至不用去了解CSV的

python按鈕csv檔案

from Tkinter import * import cv2 import matplotlib.pyplot as plt import matplotlib.image as mpimg import os import shutil import csv file

(java筆記)javaCSV檔案的方法

CSV檔案 逗號分隔值(Comma-Separated Values,CSV,有時也稱為字元分隔值,因為分隔字元也可以不是逗號),其檔案以純文字形式儲存表格資料(數字和文字)。純文字意味著該檔案是一個字元序列,不含必須像二進位制數字那樣被解讀的資料。CSV檔案由任意數目的記錄組成,記

【C++】CSV檔案

新建CSV檔案:建txt——另存(UTF-8)——字尾.csv CSVparser.hpp #ifndef _CSVPARSER_HPP_ # define _CSVPARSER_HPP_ # include <stdexcept>

sparkcsv檔案

如果是spark1.6.0請新增maven: <dependency> <groupId>com.databricks</groupId> <artifactId>s

pySparkCSV檔案、查重並寫入CSV檔案

前段時間在研究 pySpark 資料處理,深刻地感受到spark的極大魅力。自己是一個初學者,這篇部落格也只是簡單的完成了幾個簡單的工作任務,哈哈@@不說了上程式碼:from pyspark import SparkConf,SparkContext import csv

javaCSV檔案的兩種方法

BufferedWriter writer =new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "GBK")) ;// 附加 上述程式碼片段作用: 轉碼 逗號分隔值(Com

python資料儲存系列教程——python(pandas)csv檔案

全棧工程師開發手冊 (作者:欒鵬) CSV檔案的規範 1、使用回車換行(兩個字元)作為行分隔符,最後一行資料可以沒有這兩個字元。 2、標題行是否需要,要雙方顯示約定 3、每行記錄的欄位數要相同,使用逗號分隔。逗號是預設使用的值

python csv檔案

1. 將DataFrame資料寫入csv (1)用 csv包一行一行的寫入   import csv #python2可以用file替代open with open("test.csv","w") as csvfile:      writer =

Pythoncsv檔案的幾種方法 及 pandas.read_csv引數全解

''' Python讀寫csv檔案 逗號分隔值(Comma-Separated Values,CSV,有時也稱為字元分隔值,因為分隔字元也可以不是逗號), 其檔案以純文字形式儲存表格資料(數字和文字)。 純文字意味著該檔案是一個字元序列,不含必須像二進位制數字那樣被解讀的資

csv檔案 可選擇部分列進行操作 按列來統計 並形成字典

用pandas讀取部分列,可以參考第一部分程式碼。 #!/usr/bin/env python # -*- coding: UTF-8 -*- ''' 此程式將原始資料中無關的列給去掉了,只保留時間、ID、等列,另外pandas還在第一列添加了索引列 ''' import

「Python」pythoncsv檔案並增加行列

# -*- coding: utf-8 -*- """ Created on Thu Aug 17 11:28:17 2017 @author: Shawn Yuen """ import csv

使用 Python csv 檔案

非關係型資料庫中,以文件型的資料庫 MongoDB 最為著名。還有一個很好的全文檢索引擎 Elasticsearch,基本上也可以當做一個文件型的資料庫來使用。 建立 csv 檔案: import csv with open("./csv_tutot

Python3csv檔案

新手做機器學習,很多東西都得一點一點積累,第一步從讀寫csv資料檔案開始,檔案中包含列名。 1、讀入csv檔案 import csv with open("filename.csv","r",encoding="utf-8") as csvfile:

pandas學習之concat合併及CSV檔案

讀取CSV檔案 讀取中文的CSV檔案中有中文,用“UTF-8”會出現亂碼問題,解決: import pandas as pd import numpy as np data=pd.read_csv('C:/Users/elenawang/Desktop/

使用pythonCSV檔案的三種方法

Python讀寫csv檔案 覺得有用的話,歡迎一起討論相互學習~Follow Me 前言 逗號分隔值(Comma-Separated Values,CSV,有時也稱為字元分隔值,因為