CSV文件的生产与分析.doc_第1页
CSV文件的生产与分析.doc_第2页
CSV文件的生产与分析.doc_第3页
CSV文件的生产与分析.doc_第4页
CSV文件的生产与分析.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

CSV文件的生产与分析 CSV文件是指Excel可以识别的后缀名为CSV的文件,网站系统后台用来存储分析数据的时候有可能会用到它。其实CSV文件的读取和做成比较简单,主要的技术点是文件的读写。不过CSV文件的分析和生成有一定的代表性,可以通过对CSV文件的生成和分析的实现,来了解后台处理批量数据的简单思路。下面,为大家搜索了CSV文件的生产与分析,希望能给大家带来帮助!更多精彩内容请及时关注我们! 打开Excel,新建一个文件,在里面随便输入一些数据,然后另存为一个CSV文件,再次用Excel打开的时候,发现只有一个sheet。用一个记事本打开这个文件,可以看到类似如下的数据。 aaa,bbb,c,ddd aaa2,bbb2,ddd2 aaa3,bbb3,c3, aaa4,bbb4,c4,ddd4 仔细观察数据,可以确定以下几点: CSV文件是文本型文件(非二进制) 文件中的一行在Excel中显示的一行 同一行中的数据用半角逗号分隔 发现以上的规律,我们可以自己也生成一个CSV文件。也可以简单的分析CSV文件。 现在给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文件的生成与分析其实已经完成。如果要写适合自己需要的CSV文件分析类,完全可以根据自己的业务逻辑和需要己实现。因为CSV文件的分析确实很简单。 不过上面的程序还是存在一些问题的。这些问题在开发的过程中应当注意,不然可能出现致命的错误。 比较2个类中对资源的释放问题。CSV生成类中FileWriter对象的关闭(close()方法)是在try中执行的。而CSV分析类中InputStreamReader,BufferedReader对象的关闭(close()方法)是在finally中执行的。CSV生成类是错误的。因为在文件和流的生成过程中,是有可能产生IO异常的,如果在对象close前发生IO异常,那么close方法永远不会被调用,这样资源不会及时释放,会产生致命错误的。而在finally中的程序,是一定会被执行的语句,所以即使操作中途发生问题,也会在最后执行close方法。(try-catch-finally是java语法中基本而重要的部分,不熟悉的可查阅相关资料。) 在CSV文件的操作过程中,我们是按照半角逗号来分隔数据的,如果某个数据中正好有半角逗号,那么数据不是出错了? 如果分析的数据有全角字符,是否能够正确分析。(乱码问题) 以上的第二个问题时必须考虑的。在写一个类的时候,不要相信这个类要操作的数据或者得到的数据是好数据(完全符合要求的正确的数据),写好的一个类用完全正确的数据测试完,很有可能一个小小的数据错误的问题,就有可能导致程序处理崩溃。所以,细节问题要充分考虑并对应到,使自己编写的类具有一定的健壮性。 对于2的问题的讨论: 如果我们用Excel文件生成CSV文件,其中数据有半角逗号,Excel会怎么处理呢?试一下,可以看到类似如下的数据。 aaa,bbb,c,ddd aaa2,bbb2,ddd2 aaa3,bbb3,c3, aaa4,bb,b4,c4,ddd4 bb,b4被用双引号包围了,这样,我们自己在生成CSV文件的时候,可以模仿EXCEL的操作,把所有的数据都用双引号包围。这时候又出现一个问题,如果数据中有双引号,会怎么样?再次尝试一下。这次输入的数据是bb,b4,结果是: aaa,bbb,c,ddd aaa2,bbb2,ddd2 aaa3,bbb3,c3, aaa4,bb,b4,c4,ddd4 双引号被用2个双引号替换了。Excel是这么处理的,我们在生成Excel文件的时候可以模仿处理。这样分析数据的时候,就要有一个严格的算法来进行分析。 由于做的这个类是给web开发用的,我们可以考虑用web常用的转意,将这个字符转换成来避免这样的冲突,这样处理的好处是分析字符串的时候,处理简单化了。但是这又引发了别的问题,就是如果数据中原来就有这样的字符,在将反转义为的时候,容易把这些原有的字符也转化了。所以&符号也需要转义。 现在将2个方法折衷,即CSV数据以半角逗号分隔,以包围。数据中的&,符号进行转义。 这样的处理,将分析数据的算法难度降低,同时也解决了数据中含有半角逗号,引号的问题。 经过以上的分析,我们可以写CSV生成分析文件的类了。 首先,写出简单的转意静态方法。 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文件,可以看到分析后的数据被打印出来。 至此,csv生成,分析类做成。 使用帮助: CSVCreater.java类,用来生成CSV文件的类。 构造函数publicCSVCreater(Stringarg)throwsIOException 参数:arg要生成的csv文件的绝对路径 使用例CSVCreatercsvCre=newCSVCreater(C:te

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论