CSV文件是指Excel可以識(shí)別的后綴名為CSV的文件,網(wǎng)站系統(tǒng)后臺(tái)用來存儲(chǔ)分析數(shù)據(jù)的時(shí)候有可能會(huì)用到它。其實(shí)CSV文件的讀取和做成比較簡(jiǎn)單,主要的技術(shù)點(diǎn)是文件的讀寫。不過CSV文件的分析和生成有一定的代表性,可以通過對(duì)CSV文件的生成和分析的實(shí)現(xiàn),來了解后臺(tái)處理批量數(shù)據(jù)的簡(jiǎn)單思路。
打開Excel,新建一個(gè)文件,在里面隨便輸入一些數(shù)據(jù),然后另存為一個(gè)CSV文件,再次用Excel打開的時(shí)候,發(fā)現(xiàn)只有一個(gè)sheet。用一個(gè)記事本打開這個(gè)文件,可以看到類似如下的數(shù)據(jù)。 aaa,bbb,ccc,ddd aaa2,bbb2,,ddd2 aaa3,bbb3,ccc3, aaa4,bbb4,ccc4,ddd4
仔細(xì)觀察數(shù)據(jù),可以確定以下幾點(diǎn):
- CSV文件是文本型文件(非二進(jìn)制)
- 文件中的一行在Excel中顯示的一行
- 同一行中的數(shù)據(jù)用半角逗號(hào)分隔
發(fā)現(xiàn)以上的規(guī)律,我們可以自己也生成一個(gè)CSV文件。也可以簡(jiǎn)單的分析CSV文件。 現(xiàn)在給CSV文件的生成和分析寫個(gè)簡(jiǎn)單的例子。(如果對(duì)文件處理類不熟悉,可以看一下java的文件處理,或者看一下JDK中關(guān)于java.io.File類的幫助信息) 生成CSV文件。(HelloCsvCreater.java)
package com.vogoal.test; import java.io.FileWriter; import java.io.IOException; /** * @author SinNeR * * create a CSV file */ public class HelloCsvCreater { public static void main(String[] args) { try { FileWriter fw = new FileWriter("C:\\helloCsv.csv"); fw.write("aaa,bbb,ccc,ddd,eee,fff,ggg,hhh\r\n"); fw.write("aa1,bb1,cc1,dd1,ee1,ff1,gg1,hh1\r\n"); fw.write("aaa\r\n"); fw.write("aa2,bb2,cc2,dd2,ee2,ff2,gg2,hh2\r\n"); fw.close(); } catch (IOException e) { e.printStackTrace(); } } }
這個(gè)類編譯后運(yùn)行,可以看到在C盤根目錄下生成了一個(gè)名字為helloCsv.csv的CSV文件,雙擊打開,如下的樣子。
分析CSV文件
package com.vogoal.test; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; /** * @author SinNeR * * analysis a CSV file */ public class HelloCSVAnalysis { public static void main(String[] args) { InputStreamReader fr = null; BufferedReader br = null; try { fr = new InputStreamReader(new FileInputStream( "C:\\helloCsv.csv")); br = new BufferedReader(fr); String rec = null; String[] argsArr = null; while ((rec = br.readLine()) != null) { System.out.println(rec); argsArr = rec.split(","); for (int i = 0; i < argsArr.length; i++) { System.out.println("num " + (i + 1) + ":" + argsArr[i]); } } } catch (IOException e) { e.printStackTrace(); }finally{ try{ if ( fr != null ) fr.close(); if ( br != null ) br.close(); }catch(IOException ex){ ex.printStackTrace(); } } } }
這里將剛才生成的csv文件讀取并分析。編譯后運(yùn)行,正常情況下,可以看到剛才生成的CSV文件的內(nèi)容。
至此,CSV文件的生成與分析其實(shí)已經(jīng)完成。如果要寫適合自己需要的CSV文件分析類,完全可以根據(jù)自己的業(yè)務(wù)邏輯和需要來自己實(shí)現(xiàn)。因?yàn)镃SV文件的分析確實(shí)很簡(jiǎn)單。
不過上面的程序還是存在一些問題的。這些問題在開發(fā)的過程中應(yīng)當(dāng)注意,不然可能出現(xiàn)致命的錯(cuò)誤。
- 比較2個(gè)類中對(duì)資源的釋放問題。CSV生成類中FileWriter對(duì)象的關(guān)閉(close()方法)是在try中執(zhí)行的。而CSV分析類中InputStreamReader,BufferedReader對(duì)象的關(guān)閉(close()方法)是在finally中執(zhí)行的。CSV生成類是錯(cuò)誤的。因?yàn)樵谖募土鞯纳蛇^程中,是有可能產(chǎn)生IO異常的,如果在對(duì)象close前發(fā)生IO異常,那么close方法永遠(yuǎn)不會(huì)被調(diào)用,這樣資源不會(huì)及時(shí)釋放,會(huì)產(chǎn)生致命錯(cuò)誤的。而在finally中的程序,是一定會(huì)被執(zhí)行的語句,所以即使操作中途發(fā)生問題,也會(huì)在最后執(zhí)行close方法。(try-catch-finally是java語法中基本而重要的部分,不熟悉的可查閱相關(guān)資料。)
- 在CSV文件的操作過程中,我們是按照半角逗號(hào)來分隔數(shù)據(jù)的,如果某個(gè)數(shù)據(jù)中正好有半角逗號(hào),那么數(shù)據(jù)不是出錯(cuò)了?
- 如果分析的數(shù)據(jù)有全角字符,是否能夠正確分析。(亂碼問題)
以上的第二個(gè)問題時(shí)必須考慮的。在寫一個(gè)類的時(shí)候,不要相信這個(gè)類要操作的數(shù)據(jù)或者得到的數(shù)據(jù)是好數(shù)據(jù)(完全符合要求的正確的數(shù)據(jù)),寫好的一個(gè)類用完全正確的數(shù)據(jù)測(cè)試完,很有可能一個(gè)小小的數(shù)據(jù)錯(cuò)誤的問題,就有可能導(dǎo)致程序處理崩潰。所以,細(xì)節(jié)問題要充分考慮并對(duì)應(yīng)到,使自己編寫的類具有一定的健壯性。
出處:藍(lán)色理想
責(zé)任編輯:moby
上一頁 下一頁 Jsp常用功能—CSV文件的生成與分析 [2]
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|