關於CSV檔案的讀寫問題(特別是有雙引號和逗號的情況)
一. 對於CSV的讀寫既可以像讀寫txt檔案似的讀寫
/*===================讀檔案=======================*/
InputStreamReader read = new InputStreamReader(
new FileInputStream(file),encoding);//考慮到編碼格式
BufferedReader bufferedReader = new BufferedReader(read);
String lineTxt;
while((lineTxt = bufferedReader.readLine()) != null ){
if (!lineTxt.trim().equals("")) {
String[] temp = lineTxt.split("\t",-1);
txtList.add(temp);
}
}
read.close();
/*==================寫檔案========================*/
File txtFile = new File(filePath);
//追加
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(txtFile, true ),encoding));
if(content != null && content.size()>0){
for(Integer i=0 ; i<content.size(); i++){
String[] element = content.get(i);//一行元素
if(element != null && element.length > 0){
for(Integer j=0; j<element.length; j++){
String temp = element[j];
if(j == element.length - 1){
bw.write(temp + "\n");
}else{
bw.write(temp + separator);
}
}
}
}
也可以用java提供的庫javacsv和opencsv寫,但是注意javacsv不可追加,中文OK;opencsv可追加,但是中文會亂碼。兩者可寫入欄位中含有逗號的內容。
二. 用寫txt檔案的方式寫csv時,針對內容中的逗號和雙引號要做特殊處理(參考文章):
CSV全稱是:Comma Separated Values 或者 Character Separated Values。
儘管第一種說法更常見,但我覺得還是第二種說法更確切一些,因為你可以使用其它字元做分隔符。
使用逗號做分隔符的CSV檔案有一個好處:你可以直接用Excel開啟。如果使用其它分隔符,比如“|”,你必須告訴Excel該檔案使用“|”作分隔符,Excel才能把它匯入進來。
前幾天,project manager告訴我:我們有許多CSV檔案,都是使用“|”做分隔符,用Excel開啟的時候比較麻煩,使用者想在Excel中直接開啟。這樣就需要使用“,”做分隔符。但是檔案中有些欄位含有逗號,必須對這些逗號特殊處理,才能保證CSV檔案在Excel中正確開啟。他還給了我一個演算法:
如果欄位中有逗號(,),該欄位使用雙引號(”)括起來;
如果該欄位中有雙引號,該雙引號前要再加一個雙引號,然後把該欄位使用雙引號括起來。
看完project manager的要求,我真是滿頭起包啊。在IT業混了十幾年了,竟然不知道這樣處理逗號。
舉幾個例子:
欄位處理前 | 欄位處理後 |
abc,d2 | "abc,d2" |
ab"c,d2 | "ab""c,d2" |
"abc | """abc" |
"" | """""" |
如果欄位中有兩個挨著的雙引號,比如:aaa”“ccc。這種情況不用特殊處理。這是我在寫這篇部落格的時候才想起來的,趕忙使用Excel測試了一下。還好,不用特殊處理就能正常開啟,不然我還得改程式。當然了,如果你把它處理成:”aaa”“”“ccc” Excel也能正常開啟。事後總結總結真是有好處啊。
另外,如果某欄位第一個字元是空格,第二個字元是雙引號,這種情況不用特殊處理。Project Manager在給我描述演算法的時候,也舉了一個欄位只有一個雙引號的例子,但他不小心在雙引號前面加了個空格,把問題掩蓋過去了。
因此在寫CSV檔案時,需要先判斷是否有逗號和雙引號,並做相應處理
boolean quoteFlag = false;//標記是否新增過雙引號
//20161214 若發現有逗號 需前後加引號 否則會出現串列的情況
String value = element[i];
if(value.contains("\"")){ //若發現有雙引號 需要將字串中的一個雙引號替換為兩個 並且需前後加雙引號
value = value.replaceAll("\"","\"\"");
value = "\"" + value + "\"";
quoteFlag = true;
}
if(value.contains(",") && !quoteFlag){ //若發現有逗號 需前後加引號
value = "\"" + value + "\"";
}
if(j == fileHeader.size() - 1){
bw.write(value + "\n");
}else{
bw.write(value + separator);
}
讀這樣的csv檔案時,需要做類似的處理:
//去掉字串前後字串 for csv輸出
public static String clearStartAndEndQuote(String str){
if(str != null && str.length()>=2) {
if(str.indexOf("\"")==0) str = str.substring(1,str.length()); //去掉第一個 "
if(str.lastIndexOf("\"")==(str.length()-1)) str = str.substring(0,str.length()-1); //去掉最後一個 "
str = str.replaceAll("\"\"","\"");//把兩個雙引號換成一個雙引號
}
return str;
}
String tempValue = ClassUtil.clearStartAndEndQuote(temp[j]);
三. 文字內容的逗號分隔(參考文章)
當大家進行這一操作的時候通常會遇到如下問題。
1: 想分割資料 例如:
"123","Jack jona","Computer science"
"234","Joen Dan", "Philosophy"
//當遇到這種資料的時候可直接用 逗號進行分割。
String[] strArr = str.trim().split(",",-1);
2: 分割資料如下:
"123", "jack jona", "New York, NY"
"234", "Lee Jack", "Fort myers, FL"
//當遇到這種資料的時候可以直接使用
String[] strArr = str.trim().split(",(?=([^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)",-1); //雙引號內的逗號不分割 雙引號外的逗號進行分割
//進行分割。 這種的好處是隻對引號外面的逗號進行分割,對引號內的不分割。
//簡單的說這種分割得出的結果是
123| jack jona| New York, NY
234| Lee Jack| Fort myers, FL
相關推薦
關於CSV檔案的讀寫問題(特別是有雙引號和逗號的情況)(轉載)
最新專案中遇到CVS中有特殊字元(英文逗號、引號),導致解析出現問題,度娘一把查詢到解決辦法,記錄一下轉載:https://blog.csdn.net/xyr05288/article/details/53696464一. 對於CSV的讀寫既可以像讀寫txt檔案似的讀寫/*=
關於CSV檔案的讀寫問題(特別是有雙引號和逗號的情況)
一. 對於CSV的讀寫既可以像讀寫txt檔案似的讀寫 /*===================讀檔案=======================*/ InputStreamReader read = new InputStreamReader( new
C++ 菜鳥之路 (三) Vector 的使用 與 csv檔案讀寫
Vector 的基本用法 在c++中,vector 是一個十分有用的容器, 相比一般的陣列可一方便的進行插入和刪除, 可以方便的查詢相關的資訊和清空。 (1)標頭檔案#include<vector>. (2)建立vector物件,ve
MPI檔案讀寫(1)
使用MPI的檔案讀寫函式時,檔案需為二進位制檔案,可以使用程式碼自己進行格式轉換 示例程式碼: //將儲存三個數的文字檔案轉換為二進位制檔案 int r,c,m; FILE *fp = fopen(filein, "r"); fscanf(fp, "%d", &r
Python對csv檔案讀寫操作
包括使用csv模組進行檔案讀寫,使用requests模組進行檔案傳送。 def pay_task_by_self(self): global success_writer, fail_writer, cont dir_path = os.path.dirname(_
python的csv檔案讀寫及避免出現空行的方法
使用列表生成csv >>> import csv >>> keys=['a','b','c','d'] >>> data=[[1,2,3,4],[5
C 檔案讀寫(二進位制檔案)
我們將介紹 C 程式設計師如何建立、開啟、關閉文字檔案或二進位制檔案。 一個檔案,無論它是文字檔案還是二進位制檔案,都是代表了一系列的位元組。C 語言不僅提供了訪問頂層的函式,也提供了底層(OS)呼叫來處理儲存裝置上的檔案。本章將講解檔案管理的重要呼叫。 開啟檔案 您可
Java實現CSV檔案讀寫操作
wechat:812716131 ------------------------------------------------------ 技術交流群請聯絡上面wechat ----------------------------------------------
python檔案讀寫(從file1中讀出資料並計算,然後將結果寫入到file2中)
要求新建兩個檔案,file1、file2,要求開啟file1檔案,分別對每一行數字進行求和,並將每一行的結果寫在file2中。 file1: 20 30 40 20 52 63 52 52 85 52 8 456 522 25 36 85 96 74 程式原始碼: 定義一個求和函式
C語言檔案讀寫(輸入輸出重定向)
freopen("D:\\test.txt","r",stdin);//檔案讀入 輸入重定向 freopen("D:\\test.txt","w",stdout);//檔案寫入 輸出重定向 檔案讀入(輸入重定向) freopen ( " D:\\test.txt
關於Android中的檔案讀寫(jniGetFDFromFileDescriptor)
Java中常用的檔案讀寫的兩個類: 1.FileInputStream/FileOutputStream(FileReader/FileWriter) 2.RandomFileAccess FileInputSteam和FileOutputStream繼承於InputStream和OutputStre
csv檔案讀寫操作
函式: PHP有自帶的分析.csv函式:fgetcsv array fgetcsv ( int $handle [, int $length [, string $delimiter [, string $enclosure]]] ) handle 一個由 fopen()
工具篇-csv檔案讀寫
目的:在Python處理資料的很多時候,需要載入檔案,通常還是csv格式,希望載入之後是個二維列表/陣列,這樣才方便處理; 1. 簡單的api能夠匯入資料到記憶體中 2. 能夠適應複雜&大資料量機器學習的場景 Pandas csv im
【python/熱力圖】從csv檔案讀入(x,y,z)畫簡單熱力圖
# -*- coding: utf-8 -*- """ Created on Fri Nov 10 21:20:25 2017 @author: zhoulei """ # Required Packages # 迴歸 import matplotlib.pyplot as
Android中檔案讀寫(輸入流和輸出流)操作總結(附原始碼)
Android中檔案讀寫操作 1. Android中檔案讀寫的原理: (1).所有檔案的儲存都是位元組的儲存。 (2).在磁碟上保留的並不是檔案的字元而是先把字元編碼成位元組,再儲存這些位元組到磁碟。 (3).在讀取檔案(
Python JSON檔案 讀寫(縮排、排序、格式化)
寫檔案,格式化 indent: 縮排(一般填4,縮排4格); sort_keys: 是否排序(預設False–不排序) def write_info(file_name, file
CSV檔案讀寫
public class CSVFileHelper { /// <summary> /// 將DataTable中資料寫入到CSV檔案中 /// </summary> /// <param name="dt"&
檔案讀寫,函式,元組和集合
1、檔案讀寫 f = open('day4','r+',encoding = 'utf-8') #讀模式 r 開啟不存在的檔案會報錯、只能讀、不能寫 #寫模式 w #1、開啟不存在的檔案,會新建一個檔案,會清空原有檔案 #2、不
C++ 檔案讀寫函式之——fopen、fread和fwrite
(1)fopen()函式:開啟檔案 包含標頭檔案: #include<stdio.h> 格式:FILE * fopen(const char * path,const char * mode) 引數: path:需要開啟的檔案路徑
excel表格另存為CSV檔案時,如何使每個單元內容都帶雙引號和逗號分隔
例如:原excel表格內容是 姓名 性別 電話 手機 張三 男 84577487 13878902345 李四 女 25878456 13978581278 另存為CSV檔案後,要求這樣的格式 "姓名","性別","電話","手機" "張三","男","84577487","13878902345" "李四"