CSV文件的生產(chǎn)與分析.doc_第1頁
CSV文件的生產(chǎn)與分析.doc_第2頁
CSV文件的生產(chǎn)與分析.doc_第3頁
CSV文件的生產(chǎn)與分析.doc_第4頁
CSV文件的生產(chǎn)與分析.doc_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

CSV文件的生產(chǎn)與分析 CSV文件是指Excel可以識別的后綴名為CSV的文件,網(wǎng)站系統(tǒng)后臺用來存儲分析數(shù)據(jù)的時(shí)候有可能會用到它。其實(shí)CSV文件的讀取和做成比較簡單,主要的技術(shù)點(diǎn)是文件的讀寫。不過CSV文件的分析和生成有一定的代表性,可以通過對CSV文件的生成和分析的實(shí)現(xiàn),來了解后臺處理批量數(shù)據(jù)的簡單思路。下面,為大家搜索了CSV文件的生產(chǎn)與分析,希望能給大家?guī)韼椭?更多精彩內(nèi)容請及時(shí)關(guān)注我們! 打開Excel,新建一個(gè)文件,在里面隨便輸入一些數(shù)據(jù),然后另存為一個(gè)CSV文件,再次用Excel打開的時(shí)候,發(fā)現(xiàn)只有一個(gè)sheet。用一個(gè)記事本打開這個(gè)文件,可以看到類似如下的數(shù)據(jù)。 aaa,bbb,c,ddd aaa2,bbb2,ddd2 aaa3,bbb3,c3, aaa4,bbb4,c4,ddd4 仔細(xì)觀察數(shù)據(jù),可以確定以下幾點(diǎn): CSV文件是文本型文件(非二進(jìn)制) 文件中的一行在Excel中顯示的一行 同一行中的數(shù)據(jù)用半角逗號分隔 發(fā)現(xiàn)以上的規(guī)律,我們可以自己也生成一個(gè)CSV文件。也可以簡單的分析CSV文件。 現(xiàn)在給CSV文件的生成和分析寫個(gè)簡單的例子。(如果對文件處理類不熟悉,可以看一下java的文件處理,或者看一下JDK中關(guān)于java.io.File類的幫助信息) 生成CSV文件。(HelloCsvCreater.java) package.vogoal.test; importjava.io.FileWriter; importjava.io.IOException; /* *authorSinNeR * *createaCSVfile */ publicclassHelloCsvCreater publicstaticvoidmain(Stringargs) try FileWriterfw=newFileWriter(C:helloCsv.csv); fw.write(aaa,bbb,c,ddd,eee,fff,ggg,hhhrn); fw.write(aa1,bb1,1,dd1,ee1,ff1,gg1,hh1rn); fw.write(aaarn); fw.write(aa2,bb2,2,dd2,ee2,ff2,gg2,hh2rn); fw.close(); catch(IOExceptione) e.printStackTrace(); 這個(gè)類編譯后運(yùn)行,可以看到在C盤根目錄下生成了一個(gè)名字為helloCsv.csv的CSV文件,雙擊打開,如下的樣子。 分析CSV文件 package.vogoal.test; importjava.io.BufferedReader; importjava.io.FileInputStream; importjava.io.IOException; importjava.io.InputStreamReader; /* *authorSinNeR * *analysisaCSVfile */ publicclassHelloCSVAnalysis publicstaticvoidmain(Stringargs) InputStreamReaderfr=null; BufferedReaderbr=null; try fr=newInputStreamReader(newFileInputStream( C:helloCsv.csv); br=newBufferedReader(fr); Stringrec=null; StringargsArr=null; while(rec=br.readLine()!=null) System.out.println(rec); argsArr=rec.split(,); for(inti=0;i System.out.println(num+(i+1)+:+argsArri); catch(IOExceptione) e.printStackTrace(); finally try if(fr!=null) fr.close(); if(br!=null) br.close(); catch(IOExceptionex) ex.printStackTrace(); 這里將剛才生成的csv文件讀取并分析。編譯后運(yùn)行,正常情況下,可以看到剛才生成的CSV文件的內(nèi)容。 至此,CSV文件的生成與分析其實(shí)已經(jīng)完成。如果要寫適合自己需要的CSV文件分析類,完全可以根據(jù)自己的業(yè)務(wù)邏輯和需要己實(shí)現(xiàn)。因?yàn)镃SV文件的分析確實(shí)很簡單。 不過上面的程序還是存在一些問題的。這些問題在開發(fā)的過程中應(yīng)當(dāng)注意,不然可能出現(xiàn)致命的錯(cuò)誤。 比較2個(gè)類中對資源的釋放問題。CSV生成類中FileWriter對象的關(guān)閉(close()方法)是在try中執(zhí)行的。而CSV分析類中InputStreamReader,BufferedReader對象的關(guān)閉(close()方法)是在finally中執(zhí)行的。CSV生成類是錯(cuò)誤的。因?yàn)樵谖募土鞯纳蛇^程中,是有可能產(chǎn)生IO異常的,如果在對象close前發(fā)生IO異常,那么close方法永遠(yuǎn)不會被調(diào)用,這樣資源不會及時(shí)釋放,會產(chǎn)生致命錯(cuò)誤的。而在finally中的程序,是一定會被執(zhí)行的語句,所以即使操作中途發(fā)生問題,也會在最后執(zhí)行close方法。(try-catch-finally是java語法中基本而重要的部分,不熟悉的可查閱相關(guān)資料。) 在CSV文件的操作過程中,我們是按照半角逗號來分隔數(shù)據(jù)的,如果某個(gè)數(shù)據(jù)中正好有半角逗號,那么數(shù)據(jù)不是出錯(cuò)了? 如果分析的數(shù)據(jù)有全角字符,是否能夠正確分析。(亂碼問題) 以上的第二個(gè)問題時(shí)必須考慮的。在寫一個(gè)類的時(shí)候,不要相信這個(gè)類要操作的數(shù)據(jù)或者得到的數(shù)據(jù)是好數(shù)據(jù)(完全符合要求的正確的數(shù)據(jù)),寫好的一個(gè)類用完全正確的數(shù)據(jù)測試完,很有可能一個(gè)小小的數(shù)據(jù)錯(cuò)誤的問題,就有可能導(dǎo)致程序處理崩潰。所以,細(xì)節(jié)問題要充分考慮并對應(yīng)到,使自己編寫的類具有一定的健壯性。 對于2的問題的討論: 如果我們用Excel文件生成CSV文件,其中數(shù)據(jù)有半角逗號,Excel會怎么處理呢?試一下,可以看到類似如下的數(shù)據(jù)。 aaa,bbb,c,ddd aaa2,bbb2,ddd2 aaa3,bbb3,c3, aaa4,bb,b4,c4,ddd4 bb,b4被用雙引號包圍了,這樣,我們自己在生成CSV文件的時(shí)候,可以模仿EXCEL的操作,把所有的數(shù)據(jù)都用雙引號包圍。這時(shí)候又出現(xiàn)一個(gè)問題,如果數(shù)據(jù)中有雙引號,會怎么樣?再次嘗試一下。這次輸入的數(shù)據(jù)是bb,b4,結(jié)果是: aaa,bbb,c,ddd aaa2,bbb2,ddd2 aaa3,bbb3,c3, aaa4,bb,b4,c4,ddd4 雙引號被用2個(gè)雙引號替換了。Excel是這么處理的,我們在生成Excel文件的時(shí)候可以模仿處理。這樣分析數(shù)據(jù)的時(shí)候,就要有一個(gè)嚴(yán)格的算法來進(jìn)行分析。 由于做的這個(gè)類是給web開發(fā)用的,我們可以考慮用web常用的轉(zhuǎn)意,將這個(gè)字符轉(zhuǎn)換成來避免這樣的沖突,這樣處理的好處是分析字符串的時(shí)候,處理簡單化了。但是這又引發(fā)了別的問題,就是如果數(shù)據(jù)中原來就有這樣的字符,在將反轉(zhuǎn)義為的時(shí)候,容易把這些原有的字符也轉(zhuǎn)化了。所以&符號也需要轉(zhuǎn)義。 現(xiàn)在將2個(gè)方法折衷,即CSV數(shù)據(jù)以半角逗號分隔,以包圍。數(shù)據(jù)中的&,符號進(jìn)行轉(zhuǎn)義。 這樣的處理,將分析數(shù)據(jù)的算法難度降低,同時(shí)也解決了數(shù)據(jù)中含有半角逗號,引號的問題。 經(jīng)過以上的分析,我們可以寫CSV生成分析文件的類了。 首先,寫出簡單的轉(zhuǎn)意靜態(tài)方法。 publicstaticStringCSVEncode(Stringin) if(in=null) return; in.replaceAll(&,&); in.replaceAll(,); returnin; publicstaticStringCSVDecode(Stringin) if(in=null) return; in.replaceAll(,); in.replaceAll(&,&); returnin; CSV文件生成類: package.vogoal.util.csv; importjava.io.FileOutputStream; importjava.io.IOException; import.vogoal.util.UtilCla; /* *authorSinNeR *bbs.blueidea. * *CSVCreater */ publicclassCSVCreater privateFileOutputStreamfos=null; privateStringBuffersb=null; privatebooleanconvertFlag=false; publicstaticfinalStringDEL_CHAR=,; publicstaticfinalStringAV_CHAR=; publicCSVCreater(Stringarg)throwsIOException fos=newFileOutputStream(arg,false); sb=newStringBuffer(); publicvoidsetData(Stringdata) if(convertFlag) data=UtilCla.CSVEncode(data); sb.append(AV_CHAR); sb.append(data); sb.append(AV_CHAR); sb.append(DEL_CHAR); publicvoidsetConvertFlag(booleanb) convertFlag=b; publicvoidwriteLine() if(sb.charAt(sb.length()-1)=,) sb.delete(sb.length()-1,sb.length(); sb.append(rn); publicvoidwriteDataByLine(Stringargs) for(inti=0;i setData(argsi); writeLine(); publicvoidclose()throwsIOException try fos.write(sb.toString().getBytes(); catch(IOExceptione) throwe; finally fos.close(); publicstaticvoidmain(Stringargs) try CSVCreatercsvCre=newCSVCreater(C:test.csv); csvCre.setConvertFlag(true); csvCre.setData(aaa); csvCre.setData(aa,a); csvCre.writeLine(); csvCre.setData(aaa); csvCre.setData(aa,a); csvCre.setData(aa,a); csvCre.writeLine(); csvCre.setData(aaa); csvCre.setData(aa,a); csvCre.setData(aa,a); csvCre.setData(aa,a); csvCre.setData(aa,a); csvCre.writeLine(); csvCre.close(); catch(IOExceptione) e.printStackTrace(); CSV文件分析類: package.vogoal.util.csv; importjava.io.BufferedReader; importjava.io.FileInputStream; importjava.io.IOException; importjava.io.InputStreamReader; importjava.util.ArrayList; import.vogoal.util.UtilCla; /* *authorSinNeR *bbs.blueidea. * *CSVAnalysis */ publicclassCSVAnalysis privateInputStreamReaderfr=null; privatebooleanconvertFlag=false; privateArrayListdataContainer=newArrayList(); publicstaticfinalStringDEL_CHAR=,; publicstaticfinalStringAV_CHAR=; publicCSVAnalysis(Stringf)throwsIOException fr=newInputStreamReader(newFileInputStream(f); publicvoidsetConvertFlag(booleanb) convertFlag=b; publicArrayListanalysis()throwsIOException BufferedReaderbr=newBufferedReader(fr); Stringrec=null; try while(rec=br.readLine()!=null) ArrayListalLine=analysisLine(rec); dataContainer.add(alLine); catch(IOExceptione) throwe; finally br.close(); returndataContainer; privateArrayListanalysisLine(StringstrLine) System.out.println(strLine); ArrayListal=newArrayList(); StringdataArr=strLine.split(AV_CHAR); for(inti=1;i if(convertFlag) al.add(UtilCla.CSVDecode(dataArri); else al.add(dataArri); returnal; publicvoidclose()throwsIOException fr.close(); publicstaticvoidmain(Stringargs) try CSVAnalysiscsvAna=newCSVAnalysis(C:test.csv); csvAna.setConvertFlag(true); ArrayListal=csvAna.analysis(); for(inti=0;i ArrayListal1=(ArrayList)al.get(i); for(intj=0;j System.out.println(al1.get(j); csvAna.close(); catch(IOExceptione) e.printStackTrace(); 寫好這些類之后,就可以開始著手測試了。 寫一個(gè)測試CSV文件生成的jsp文件。如: createacsvfile 寫一個(gè)測試CSV文件分析的jsp文件。如: analysisacsvfile 將編譯后的class拷貝到TOMCAT自己的應(yīng)用的WEB-INF下。將jsp文件放到自己的應(yīng)用下。 然后啟動TOMCAT,訪問jsp文件,當(dāng)訪問creCSV.jsp的時(shí)候,正常情況下可以看到C盤根目錄下生成了一個(gè)test.csv文件。然后訪問anaCSV.jsp文件,可以看到分析后的數(shù)據(jù)被打印出來。 至此,csv生成,分析類做成。 使用幫助: CSVCreater.java類,用來生成CSV文件的類。 構(gòu)造函數(shù)publicCSVCreater(Stringarg)throwsIOException 參數(shù):arg要生成的csv文件的絕對路徑 使用例CSVCreatercsvCre=newCSVCreater(C:te

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論