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ù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

CSV文件的生產(chǎn)與分析 CSV文件是指Excel可以識別的后綴名為CSV的文件,網(wǎng)站系統(tǒng)后臺用來存儲分析數(shù)據(jù)的時候有可能會用到它。其實CSV文件的讀取和做成比較簡單,主要的技術點是文件的讀寫。不過CSV文件的分析和生成有一定的代表性,可以通過對CSV文件的生成和分析的實現(xiàn),來了解后臺處理批量數(shù)據(jù)的簡單思路。下面,為大家搜索了CSV文件的生產(chǎn)與分析,希望能給大家?guī)韼椭?更多精彩內容請及時關注我們! 打開Excel,新建一個文件,在里面隨便輸入一些數(shù)據(jù),然后另存為一個CSV文件,再次用Excel打開的時候,發(fā)現(xiàn)只有一個sheet。用一個記事本打開這個文件,可以看到類似如下的數(shù)據(jù)。 aaa,bbb,c,ddd aaa2,bbb2,ddd2 aaa3,bbb3,c3, aaa4,bbb4,c4,ddd4 仔細觀察數(shù)據(jù),可以確定以下幾點: CSV文件是文本型文件(非二進制) 文件中的一行在Excel中顯示的一行 同一行中的數(shù)據(jù)用半角逗號分隔 發(fā)現(xiàn)以上的規(guī)律,我們可以自己也生成一個CSV文件。也可以簡單的分析CSV文件。 現(xiàn)在給CSV文件的生成和分析寫個簡單的例子。(如果對文件處理類不熟悉,可以看一下java的文件處理,或者看一下JDK中關于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(); 這個類編譯后運行,可以看到在C盤根目錄下生成了一個名字為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文件讀取并分析。編譯后運行,正常情況下,可以看到剛才生成的CSV文件的內容。 至此,CSV文件的生成與分析其實已經(jīng)完成。如果要寫適合自己需要的CSV文件分析類,完全可以根據(jù)自己的業(yè)務邏輯和需要己實現(xiàn)。因為CSV文件的分析確實很簡單。 不過上面的程序還是存在一些問題的。這些問題在開發(fā)的過程中應當注意,不然可能出現(xiàn)致命的錯誤。 比較2個類中對資源的釋放問題。CSV生成類中FileWriter對象的關閉(close()方法)是在try中執(zhí)行的。而CSV分析類中InputStreamReader,BufferedReader對象的關閉(close()方法)是在finally中執(zhí)行的。CSV生成類是錯誤的。因為在文件和流的生成過程中,是有可能產(chǎn)生IO異常的,如果在對象close前發(fā)生IO異常,那么close方法永遠不會被調用,這樣資源不會及時釋放,會產(chǎn)生致命錯誤的。而在finally中的程序,是一定會被執(zhí)行的語句,所以即使操作中途發(fā)生問題,也會在最后執(zhí)行close方法。(try-catch-finally是java語法中基本而重要的部分,不熟悉的可查閱相關資料。) 在CSV文件的操作過程中,我們是按照半角逗號來分隔數(shù)據(jù)的,如果某個數(shù)據(jù)中正好有半角逗號,那么數(shù)據(jù)不是出錯了? 如果分析的數(shù)據(jù)有全角字符,是否能夠正確分析。(亂碼問題) 以上的第二個問題時必須考慮的。在寫一個類的時候,不要相信這個類要操作的數(shù)據(jù)或者得到的數(shù)據(jù)是好數(shù)據(jù)(完全符合要求的正確的數(shù)據(jù)),寫好的一個類用完全正確的數(shù)據(jù)測試完,很有可能一個小小的數(shù)據(jù)錯誤的問題,就有可能導致程序處理崩潰。所以,細節(jié)問題要充分考慮并對應到,使自己編寫的類具有一定的健壯性。 對于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文件的時候,可以模仿EXCEL的操作,把所有的數(shù)據(jù)都用雙引號包圍。這時候又出現(xiàn)一個問題,如果數(shù)據(jù)中有雙引號,會怎么樣?再次嘗試一下。這次輸入的數(shù)據(jù)是bb,b4,結果是: aaa,bbb,c,ddd aaa2,bbb2,ddd2 aaa3,bbb3,c3, aaa4,bb,b4,c4,ddd4 雙引號被用2個雙引號替換了。Excel是這么處理的,我們在生成Excel文件的時候可以模仿處理。這樣分析數(shù)據(jù)的時候,就要有一個嚴格的算法來進行分析。 由于做的這個類是給web開發(fā)用的,我們可以考慮用web常用的轉意,將這個字符轉換成來避免這樣的沖突,這樣處理的好處是分析字符串的時候,處理簡單化了。但是這又引發(fā)了別的問題,就是如果數(shù)據(jù)中原來就有這樣的字符,在將反轉義為的時候,容易把這些原有的字符也轉化了。所以&符號也需要轉義。 現(xiàn)在將2個方法折衷,即CSV數(shù)據(jù)以半角逗號分隔,以包圍。數(shù)據(jù)中的&,符號進行轉義。 這樣的處理,將分析數(shù)據(jù)的算法難度降低,同時也解決了數(shù)據(jù)中含有半角逗號,引號的問題。 經(jīng)過以上的分析,我們可以寫CSV生成分析文件的類了。 首先,寫出簡單的轉意靜態(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(); 寫好這些類之后,就可以開始著手測試了。 寫一個測試CSV文件生成的jsp文件。如: createacsvfile 寫一個測試CSV文件分析的jsp文件。如: analysisacsvfile 將編譯后的class拷貝到TOMCAT自己的應用的WEB-INF下。將jsp文件放到自己的應用下。 然后啟動TOMCAT,訪問jsp文件,當訪問creCSV.jsp的時候,正常情況下可以看到C盤根目錄下生成了一個test.csv文件。然后訪問anaCSV.jsp文件,可以看到分析后的數(shù)據(jù)被打印出來。 至此,csv生成,分析類做成。 使用幫助: CSVCreater.java類,用來生成CSV文件的類。 構造函數(shù)publicCSVCreater(Stringarg)throwsIOException 參數(shù):arg要生成的csv文件的絕對路徑 使用例CSVCreatercsvCre=newCSVCreater(C:te

溫馨提示

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

評論

0/150

提交評論