- 浏览: 143028 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
javavsnet:
jsp页面:<%response.setHeader(& ...
IE中iframe跨域丢失Session问题 p3p -
lz12366:
我测试的,IE7.0参数长度不止2083.。不知道你是怎么测试 ...
ie6 ie7 ie8 url长度的问题 -
dingherry:
挺好理解的,学习了
<script>标签的for属性和event属性 -
njutzyg:
你好,请问loadrunner如何监控weblogic10
LR对Tuxedo/Weblogic/websphere/Apache/MQ的性能监控步骤 -
sapphiredina:
"Tuxedo是一个很好的交易中间件,包含消息中间件 ...
Tuxedo安装,license,例子和远程客户端配置
CSV文件是指Excel可以识别的后缀名为CSV的文件,网站系统后台用来存储分析数据的时候有可能会用到它。其实CSV文件的读取和做成比较简单,主要的技术点是文件的读写。不过CSV文件的分析和生成有一定的代表性,可以通过对CSV文件的生成和分析的实现,来了解后台处理批量数据的简单思路。
打开Excel,新建一个文件,在里面随便输入一些数据,然后另存为一个CSV文件,再次用Excel打开的时候,发现只有一个sheet。用一个记事本打开这个文件,可以看到类似如下的数据。
aaa,bbb,ccc,ddd
aaa2,bbb2,,ddd2
aaa3,bbb3,ccc3,
aaa4,bbb4,ccc4,ddd4
仔细观察数据,可以确定以下几点:
- CSV文件是文本型文件(非二进制)
- 文件中的一行在Excel中显示的一行
- 同一行中的数据用半角逗号分隔
发现以上的规律,我们可以自己也生成一个CSV文件。也可以简单的分析CSV文件。
现在给CSV文件的生成和分析写个简单的例子。(如果对文件处理类不熟悉,可以看一下java的文件处理,或者看一下JDK中关于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();
}
}
}
这个类编译后运行,可以看到在C盘根目录下生成了一个名字为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文件读取并分析。编译后运行,正常情况下,可以看到刚才生成的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,ccc,ddd
aaa2,bbb2,,ddd2
aaa3,bbb3,ccc3,
aaa4,"bb,b4",ccc4,ddd4
bb,b4被用双引号包围了,这样,我们自己在生成CSV文件的时候,可以模仿EXCEL的操作,把所有的数据都用双引号包围。这时候又出现一个问题,如果数据中有双引号,会怎么样?再次尝试一下。这次输入的数据是bb,b"4",结果是:
aaa,bbb,ccc,ddd
aaa2,bbb2,,ddd2
aaa3,bbb3,ccc3,
aaa4,"bb,b""4""",ccc4,ddd4
双引号被用2个双引号替换了。Excel是这么处理的,我们在生成Excel文件的时候可以模仿处理。这样分析数据的时候,就要有一个严格的算法来进行分析。
由于做的这个类是给web开发用的,我们可以考虑用web常用的转意,将"这个字符转换成"来避免这样的冲突,这样处理的好处是分析字符串的时候,处理简单化了。但是这又引发了别的问题,就是如果数据中原来就有"这样的字符,在将"反转义为"的时候,容易把这些原有的字符也转化了。所以&符号也需要转义。
现在将2个方法折衷,即CSV数据以半角逗号分隔,以"包围。数据中的&,"符号进行转义。
这样的处理,将分析数据的算法难度降低,同时也解决了数据中含有半角逗号,引号的问题。
经过以上的分析,我们可以写CSV生成分析文件的类了。
首先,写出简单的转意静态方法。
public static String CSVEncode(String in){
if ( in == null )
return "";
in.replaceAll("&","&");
in.replaceAll("\"",""");
return in;
}
public static String CSVDecode(String in){
if ( in == null )
return "";
in.replaceAll(""","\"");
in.replaceAll("&","&");
return in;
}
CSV文件生成类:
package com.vogoal.util.csv;
import java.io.FileOutputStream;
import java.io.IOException;
import com.vogoal.util.UtilCla;
/**
* @author SinNeR
* http://bbs.blueidea.com
*
* CSVCreater
*/
public class CSVCreater {
private FileOutputStream fos = null;
private StringBuffer sb = null;
private boolean convertFlag = false;
public static final String DEL_CHAR = ",";
public static final String AV_CHAR = "\"";
public CSVCreater(String arg) throws IOException {
fos = new FileOutputStream(arg, false);
sb = new StringBuffer();
}
public void setData(String data) {
if (convertFlag)
data = UtilCla.CSVEncode(data);
sb.append(AV_CHAR);
sb.append(data);
sb.append(AV_CHAR);
sb.append(DEL_CHAR);
}
public void setConvertFlag(boolean b) {
convertFlag = b;
}
public void writeLine() {
if (sb.charAt(sb.length() - 1) == ',')
sb.delete(sb.length() - 1, sb.length());
sb.append("\r\n");
}
public void writeDataByLine(String[] args) {
for (int i = 0; i < args.length; i++)
setData(args[i]);
writeLine();
}
public void close() throws IOException {
try {
fos.write(sb.toString().getBytes());
} catch (IOException e) {
throw e;
} finally {
fos.close();
}
}
public static void main(String[] args) {
try {
CSVCreater csvCre = new CSVCreater("C:\\test.csv");
csvCre.setConvertFlag(true);
csvCre.setData("aaa");
csvCre.setData("aa,a");
csvCre.writeLine();
csvCre.setData("aa\"a");
csvCre.setData("aa,a");
csvCre.setData("aa,a");
csvCre.writeLine();
csvCre.setData("aa\"a");
csvCre.setData("aa,\"a");
csvCre.setData("aa,\"a");
csvCre.setData("aa,\"a");
csvCre.setData("aa,\"a");
csvCre.writeLine();
csvCre.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
CSV文件分析类:
package com.vogoal.util.csv;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import com.vogoal.util.UtilCla;
/**
* @author SinNeR
* http://bbs.blueidea.com
*
* CSVAnalysis
*/
public class CSVAnalysis {
private InputStreamReader fr = null;
private boolean convertFlag = false;
private ArrayList dataContainer = new ArrayList();
public static final String DEL_CHAR = ",";
public static final String AV_CHAR = "\"";
public CSVAnalysis(String f) throws IOException {
fr = new InputStreamReader(new FileInputStream(f));
}
public void setConvertFlag(boolean b) {
convertFlag = b;
}
public ArrayList analysis() throws IOException {
BufferedReader br = new BufferedReader(fr);
String rec = null;
try {
while ((rec = br.readLine()) != null) {
ArrayList alLine = analysisLine(rec);
dataContainer.add(alLine);
}
} catch (IOException e) {
throw e;
} finally {
br.close();
}
return dataContainer;
}
private ArrayList analysisLine(String strLine) {
System.out.println(strLine);
ArrayList al = new ArrayList();
String[] dataArr = strLine.split(AV_CHAR);
for (int i = 1; i < dataArr.length; i = i + 2) {
if (convertFlag)
al.add(UtilCla.CSVDecode(dataArr[i]));
else
al.add(dataArr[i]);
}
return al;
}
public void close() throws IOException {
fr.close();
}
public static void main(String[] args) {
try {
CSVAnalysis csvAna = new CSVAnalysis("C:\\test.csv");
csvAna.setConvertFlag(true);
ArrayList al = csvAna.analysis();
for (int i = 0; i < al.size(); i++) {
ArrayList al1 = (ArrayList) al.get(i);
for (int j = 0; j < al1.size(); j++) {
System.out.println(al1.get(j));
}
}
csvAna.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
出
==========================第三部分==========================================
写好这些类之后,就可以开始着手测试了。
写一个测试CSV文件生成的jsp文件。如:
<%@ page contentType="text/html" import="com.vogoal.util.*,com.vogoal.util.csv.*,java.io.IOException" %>
create a csv file
<%
try {
CSVCreater csvCre = new CSVCreater("C:\\test.csv");
csvCre.setConvertFlag(true);
csvCre.setData("aaa");
csvCre.setData("aa,a");
csvCre.writeLine();
csvCre.setData("aa\"a");
csvCre.setData("aa,a");
csvCre.setData("aa,a");
csvCre.writeLine();
csvCre.setData("aa\"a");
csvCre.setData("aa,\"a");
csvCre.setData("aa,\"a");
csvCre.setData("aa,\"a");
csvCre.setData("aa,\"a");
csvCre.writeLine();
csvCre.close();
} catch (IOException e) {
e.printStackTrace();
}
%>
写一个测试CSV文件分析的jsp文件。如:
<%@ page contentType="text/html" import="com.vogoal.util.*,com.vogoal.util.csv.*,java.io.IOException,
java.util.ArrayList" %>
analysis a csv file<br>
<%
try {
CSVAnalysis csvAna = new CSVAnalysis("C:\\test.csv");
csvAna.setConvertFlag(true);
ArrayList al = csvAna.analysis();
for (int i = 0; i < al.size(); i++) {
out.println( (i + 1) + " line start<br>");
ArrayList al1 = (ArrayList) al.get(i);
for (int j = 0; j < al1.size(); j++) {
out.println(al1.get(j));
out.println("<br>");
}
out.println( (i + 1) + " line end<br>");
}
csvAna.close();
} catch (IOException e) {
e.printStackTrace();
}
%>
将编译后的class拷贝到TOMCAT自己的应用的WEB-INF下。将jsp文件放到自己的应用下。
然后启动TOMCAT,访问jsp文件,当访问creCSV.jsp的时候,正常情况下可以看到C盘根目录下生成了一个test.csv文件。然后访问anaCSV.jsp文件,可以看到分析后的数据被打印出来。
至此,csv生成,分析类做成。
使用帮助:
CSVCreater.java类,用来生成CSV文件的类。
构造函数public CSVCreater(String arg) throws IOException
参数:arg 要生成的csv文件的绝对路径
使用例CSVCreater csvCre = new CSVCreater("C:\\test.csv");
public void setConvertFlag(boolean b)
是否转义设定函数(将半角双引号进行转义处理)
参数:true 需要转义(推荐) false 不转义
public void setData(String data)
添加单个数据的函数
public void writeLine()
结束换行函数
public void writeDataByLine(String[] args)
将一个数组的元素添加到一行并换行函数
public void close() throws IOException
必须调用的函数,写入文件并关闭文件处理的对象。
例子可参考jsp文件中的代码,但是jsp文件中的close()方法是在try块中执行的,不推荐,使用的时候还是在finally块中执行要安全一些。
这个类涉及到了文件的操作,有可能出现IOException,出现异常的时候会抛出给使用者。
CSVAnalysis.java
构造函数 public CSVAnalysis(String f) throws IOException
参数是要分析的文件的绝对路径。
public ArrayList analysis() throws IOException
分析流处理的方法,返回ArrayList对象。返回的ArrayList的数据格式是
ArrayList中存放着ArrayList对象,存放的每个ArrayList对象对应csv文件的一行。
一行对应的ArrayList中存放着String对象,为该行中所有的数据。
public void close() throws IOException
必须调用的函数,关闭文件处理的对象。
同样,这个方法应在finally块中执行要安全一些。
源码下载:CSVproc.zip
源码为上面提到过的所有的类和jsp文件
发表评论
-
李开复:2012年中国移动互联网的关键词是渗透与价值
2012-10-30 21:55 804创新工场董事长李开复在移动开发者大会上的演讲中,以“渗透与 ... -
移动开发者大会
2012-10-30 21:46 865【演讲1:中国移动互 ... -
系统的全部优化
2012-02-16 11:31 0A、防火墙设置 1.查看防火墙状态 ... -
基于tomcat,mysql项目性能优化的几个切入点
2011-09-02 21:04 1570我是做公司的框架部分,公司别的所有应用项目全基于框架开发,每个 ... -
无需密码,使用scp进行传输
2011-08-10 20:20 1668尝试过使用scp 进行文件传输,这个命令比较好,不需要本机器或 ... -
linux的sftp和scp
2011-08-10 12:50 1137Scp Scp2(安全性 ... -
redhat 常用命令
2011-05-23 11:28 978帐号 创建新的帐号有几种方法. 我们将使用最基本的方法; us ... -
redhat 5 tomcat安装
2011-05-20 17:07 1172下载apache-tomcat-5.5.28.tar.gz解压 ... -
CVSNT管理工具
2011-04-07 13:58 1008CVSNT是服务器管理工具, ... -
WEBLOGIC性能参数
2010-11-05 14:59 1982WEBLOGIC性能参数 MessagesLogged – 该 ... -
apache2.2的相关资料
2010-06-20 20:48 737你好: apache2.2的相关资料,请见附件 ... -
weblogic8Lic,不限制IP
2010-06-20 20:44 799你好: weblogic8Lic,不限制IP。 ... -
获取证书X509Certificate及客户IP地址
2010-06-20 20:37 4967你好: 1、获取证书X509Certific ... -
Eclipse启动参数配置
2010-06-20 13:21 1775将工作空间位置设置为在当前工作目录内 在此方案中,工作空间位 ... -
weblogic10.3在eclipse3.5布署
2010-06-19 21:11 1509你好: 想在eclipse中找一个weblogic ... -
java中System.Properties的用法
2010-04-21 21:44 2168所谓的 system porperty,system 指的是 ... -
log4j.properties配置详解
2010-04-06 12:21 3706在强调可重用组件开 ...
相关推荐
一个简单的java生成CSV文件
java动态实现生成CSV文件,java动态实现生成CSV文件,java动态实现生成CSV文件,java动态实现生成CSV文件,java动态实现生成CSV文件,java动态实现生成CSV文件,java动态实现生成CSV文件
在Java编程中,CSV(Comma Separated Values)文件是一种常用的格式,用于存储表格数据,如电子表格或数据库。在处理CSV文件时,尤其是涉及中文字符时,可能会遇到乱码问题。这个问题通常与字符编码设置有关。下面...
CSV文件,全称为“逗号分隔值”(Comma ...总的来说,CSV文件的生成与分析是数据处理中的基础技能,无论是在日常办公还是在开发环境中都有着广泛的应用。了解并掌握这些技能,能够帮助我们更有效地管理和利用数据。
首先,我们需要了解如何在Java中生成CSV文件。CSV文件主要由一系列行组成,每行包含一个或多个以逗号分隔的值。在Java中,我们可以使用`BufferedWriter`或者`PrintWriter`来创建和写入这些文件。例如: ```java ...
本篇文章将深入探讨如何使用Java实现CSV文件的生成,并将其通过SFTP(Secure File Transfer Protocol)协议上传到指定服务器。 首先,我们要介绍的是用于生成CSV文件的库:univocity-parsers。这是一个高效、灵活且...
在Java编程中,CSV(Comma Separated Values)文件是一种常见的数据存储格式,它以逗号分隔每一列的数据,方便数据交换和处理。当处理包含中文字符的CSV文件时,可能会遇到乱码问题,这通常与文件编码设置有关。本篇...
分步生成csv,获取数据第一行生成文件标题,同时生成第一行数据,返回标题名称。 将多csv文件压缩成zip,之后删除原csv文件
2.生成csv,中文无乱码,数据不会科学计数法; 3.支持大数据下载; 4.后台服务java语言实现,前端不限制; 5.前端代码: [removed]void(0)" class="layui-btn"> <i class="fa fa-refresh"> 导出Excel ...
在我们需求中需要读取一个csv文件的数据,但是只有旧的csv的几列数据再新写入一个csv文件,而且在旧的数据有空的数据,需要判断旧的csv的空值。可能写的存在不完善!但是应用的需求里面还是能用的
在做项目的时候,发现使用POI无法解析以csv文件结尾的文件,虽然csv文件能用Excel打开,但是csv文件没有像Excel一样有规定的电子表格形式,故使用POI无法解析csv文件,在网上找了一下,发现java有提供java csv文件来...
Java 使用 JDBC 将数据库数据导出到 CSV 文件 Java 是一种广泛使用的编程语言,它提供了多种方式来处理数据库数据,而 JDBC(Java Database Connectivity)是 Java 中连接数据库的标准 API 之一。将数据库数据导出...
在Java编程中,将CSV(逗号分隔值)文件的数据导入到MySQL数据库是一项常见的任务。这个过程涉及几个关键步骤,包括读取CSV文件、解析数据、建立与数据库的连接以及执行SQL插入语句。本篇文章将详细讲解如何使用java...
将示波器中波形数据.csv文件导入matlab中进行频谱分析
JAVA生成PDF,最常见的是采用itext组件来动态构建PDF文件,这里,我主要介绍的是采用jasperreport模版来定制生成PDF。
### Java操作CSV文件知识点 #### 一、简介与背景 在日常的数据处理工作中,CSV(Comma-Separated Values)文件是一种常见的数据交换格式。它简单易用且跨平台兼容性好,常被用于导入导出数据、数据分析等场景。在...
在IT行业中,CSV(Comma Separated Values)文件是一种广泛使用的数据交换格式,因其简单、通用而备受青睐。本文将深入探讨如何读取和创建CSV文件,并特别关注自动解析文件编码方式这一关键环节。我们将使用Java语言...
在Java编程环境中,导出CSV(Comma Separated Values)文件是一种常见的数据交换格式,尤其在数据处理和分析中非常流行。CSV文件以其简洁、易读的特性,使得它们成为跨平台传输数据的理想选择。本篇文章将深入探讨...
采用MATLAB 将csv文件的快速生成分析图 1.采用MATLAB 打开plotcsv.m 2.按F5运行程序 3.plotcsv.m将文件“vnAllFile.csv”绘制成波形图 4.如果需要绘制其他名字的csv文件,将plotcsv.m文件中的vnAllFile.csv文件名改...