




已閱讀5頁(yè),還剩11頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
CSV文件的生產(chǎn)與分析 CSV文件是指Excel可以識(shí)別的后綴名為CSV的文件,網(wǎng)站系統(tǒng)后臺(tái)用來(lái)存儲(chǔ)分析數(shù)據(jù)的時(shí)候有可能會(huì)用到它。其實(shí)CSV文件的讀取和做成比較簡(jiǎn)單,主要的技術(shù)點(diǎn)是文件的讀寫。不過(guò)CSV文件的分析和生成有一定的代表性,可以通過(guò)對(duì)CSV文件的生成和分析的實(shí)現(xiàn),來(lái)了解后臺(tái)處理批量數(shù)據(jù)的簡(jiǎn)單思路。下面,為大家搜索了CSV文件的生產(chǎn)與分析,希望能給大家?guī)?lái)幫助!更多精彩內(nèi)容請(qǐng)及時(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ù)用半角逗號(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.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í)很簡(jiǎn)單。 不過(guò)上面的程序還是存在一些問(wèn)題的。這些問(wèn)題在開發(fā)的過(guò)程中應(yīng)當(dāng)注意,不然可能出現(xiàn)致命的錯(cuò)誤。 比較2個(gè)類中對(duì)資源的釋放問(wèn)題。CSV生成類中FileWriter對(duì)象的關(guān)閉(close()方法)是在try中執(zhí)行的。而CSV分析類中InputStreamReader,BufferedReader對(duì)象的關(guān)閉(close()方法)是在finally中執(zhí)行的。CSV生成類是錯(cuò)誤的。因?yàn)樵谖募土鞯纳蛇^(guò)程中,是有可能產(chǎn)生IO異常的,如果在對(duì)象close前發(fā)生IO異常,那么close方法永遠(yuǎn)不會(huì)被調(diào)用,這樣資源不會(huì)及時(shí)釋放,會(huì)產(chǎn)生致命錯(cuò)誤的。而在finally中的程序,是一定會(huì)被執(zhí)行的語(yǔ)句,所以即使操作中途發(fā)生問(wèn)題,也會(huì)在最后執(zhí)行close方法。(try-catch-finally是java語(yǔ)法中基本而重要的部分,不熟悉的可查閱相關(guān)資料。) 在CSV文件的操作過(guò)程中,我們是按照半角逗號(hào)來(lái)分隔數(shù)據(jù)的,如果某個(gè)數(shù)據(jù)中正好有半角逗號(hào),那么數(shù)據(jù)不是出錯(cuò)了? 如果分析的數(shù)據(jù)有全角字符,是否能夠正確分析。(亂碼問(wèn)題) 以上的第二個(gè)問(wèn)題時(shí)必須考慮的。在寫一個(gè)類的時(shí)候,不要相信這個(gè)類要操作的數(shù)據(jù)或者得到的數(shù)據(jù)是好數(shù)據(jù)(完全符合要求的正確的數(shù)據(jù)),寫好的一個(gè)類用完全正確的數(shù)據(jù)測(cè)試完,很有可能一個(gè)小小的數(shù)據(jù)錯(cuò)誤的問(wèn)題,就有可能導(dǎo)致程序處理崩潰。所以,細(xì)節(jié)問(wèn)題要充分考慮并對(duì)應(yīng)到,使自己編寫的類具有一定的健壯性。 對(duì)于2的問(wèn)題的討論: 如果我們用Excel文件生成CSV文件,其中數(shù)據(jù)有半角逗號(hào),Excel會(huì)怎么處理呢?試一下,可以看到類似如下的數(shù)據(jù)。 aaa,bbb,c,ddd aaa2,bbb2,ddd2 aaa3,bbb3,c3, aaa4,bb,b4,c4,ddd4 bb,b4被用雙引號(hào)包圍了,這樣,我們自己在生成CSV文件的時(shí)候,可以模仿EXCEL的操作,把所有的數(shù)據(jù)都用雙引號(hào)包圍。這時(shí)候又出現(xiàn)一個(gè)問(wèn)題,如果數(shù)據(jù)中有雙引號(hào),會(huì)怎么樣?再次嘗試一下。這次輸入的數(shù)據(jù)是bb,b4,結(jié)果是: aaa,bbb,c,ddd aaa2,bbb2,ddd2 aaa3,bbb3,c3, aaa4,bb,b4,c4,ddd4 雙引號(hào)被用2個(gè)雙引號(hào)替換了。Excel是這么處理的,我們?cè)谏蒃xcel文件的時(shí)候可以模仿處理。這樣分析數(shù)據(jù)的時(shí)候,就要有一個(gè)嚴(yán)格的算法來(lái)進(jìn)行分析。 由于做的這個(gè)類是給web開發(fā)用的,我們可以考慮用web常用的轉(zhuǎn)意,將這個(gè)字符轉(zhuǎn)換成來(lái)避免這樣的沖突,這樣處理的好處是分析字符串的時(shí)候,處理簡(jiǎn)單化了。但是這又引發(fā)了別的問(wèn)題,就是如果數(shù)據(jù)中原來(lái)就有這樣的字符,在將反轉(zhuǎn)義為的時(shí)候,容易把這些原有的字符也轉(zhuǎn)化了。所以&符號(hào)也需要轉(zhuǎn)義。 現(xiàn)在將2個(gè)方法折衷,即CSV數(shù)據(jù)以半角逗號(hào)分隔,以包圍。數(shù)據(jù)中的&,符號(hào)進(jìn)行轉(zhuǎn)義。 這樣的處理,將分析數(shù)據(jù)的算法難度降低,同時(shí)也解決了數(shù)據(jù)中含有半角逗號(hào),引號(hào)的問(wèn)題。 經(jīng)過(guò)以上的分析,我們可以寫CSV生成分析文件的類了。 首先,寫出簡(jiǎn)單的轉(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(); 寫好這些類之后,就可以開始著手測(cè)試了。 寫一個(gè)測(cè)試CSV文件生成的jsp文件。如: createacsvfile 寫一個(gè)測(cè)試CSV文件分析的jsp文件。如: analysisacsvfile 將編譯后的class拷貝到TOMCAT自己的應(yīng)用的WEB-INF下。將jsp文件放到自己的應(yīng)用下。 然后啟動(dòng)TOMCAT,訪問(wèn)jsp文件,當(dāng)訪問(wèn)creCSV.jsp的時(shí)候,正常情況下可以看到C盤根目錄下生成了一個(gè)test.csv文件。然后訪問(wèn)anaCSV.jsp文件,可以看到分析后的數(shù)據(jù)被打印出來(lái)。 至此,csv生成,分析類做成。 使用幫助: CSVCreater.java類,用來(lái)生成CSV文件的類。 構(gòu)造函數(shù)publicCSVCreater(Stringarg)throwsIOException 參數(shù):arg要生成的csv文件的絕對(duì)路徑 使用例CSVCreatercsvCre=newCSVCreater(C:te
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 能量管理與優(yōu)化協(xié)同研究-洞察闡釋
- 數(shù)據(jù)隱私保護(hù)與家庭信息安全的法律與政策研究-洞察闡釋
- 新冠疫苗接種策略優(yōu)化-洞察闡釋
- AI驅(qū)動(dòng)的移動(dòng)支付市場(chǎng)預(yù)測(cè)-洞察闡釋
- 寵物攝影技術(shù)交流-洞察闡釋
- 虛擬現(xiàn)實(shí)輔助的兒童色覺(jué)障礙康復(fù)訓(xùn)練模式探索-洞察闡釋
- 基于AI與大數(shù)據(jù)的期貨市場(chǎng)服務(wù)模式創(chuàng)新研究-洞察闡釋
- 數(shù)字化平臺(tái)與mall協(xié)同的資源分配模式-洞察闡釋
- 醫(yī)療服務(wù)前期介入合同協(xié)議書范文
- 出租車行業(yè)駕駛員服務(wù)質(zhì)量培訓(xùn)計(jì)劃
- 蒙牛冰淇淋經(jīng)銷商管理制度
- 2022年湛江市中考聯(lián)考物理試題含解析
- 振動(dòng)測(cè)量評(píng)價(jià)標(biāo)準(zhǔn)介紹
- 玉雕工具磨頭講解
- 配方法練習(xí)題
- 外協(xié)出入庫(kù)流程
- 復(fù)習(xí):金屬的化學(xué)性質(zhì)
- 公路隧道斜井與正洞交叉口施工方法
- 出庫(kù)單樣本12623
- 衛(wèi)生保潔檢查表
- 年產(chǎn)10萬(wàn)噸氯乙烯工藝設(shè)計(jì)(共53頁(yè))
評(píng)論
0/150
提交評(píng)論