csv java

COMMA SEPARATED VALUE的缩写,出现在档案总管中的档案类型是「逗号分格」,依计算机原来的设定,如果直接点选该档案,计算机将以EXCEL的模式开启该档案。但建议您千万不要这么做,因为CSV档如果以EXCEL开启,由于计算机档案数据转换的原因,会将其CRC之数值改做科学记号方式储存,而造成档案中的 CRC值发生错误。这也是笔者初出茅庐时所得到的惨痛经验,但如果想一窥CSV档的真实面貌,笔者建议您使用WORDPAD或是记事本(NOTE)来开启,再则先另存新档后用EXCEL开启,也是方法之一。
开启后的CSV档包含了四或五个字段(部分),由左至右分别记载着:文件名称(XXXX.JPG)、档案大小(以BYTE为单位)、CRC32值(八个英文字母或数字组成)、
档案路径(档案储存的子目录名称)和档案内容描述(一般来说都是明星的英文姓名甚或是专辑名称,也可能空白)。而其中第四栏「档案路径」因为每个人储存整理图档的方式不同,所以本栏通常不存在,而一般有含有「档案路径」这栏的CSV档,又称为ECSV档案 CSV文件,也叫逗号分隔值文件,英文名称COMMA SEPARATED VALUE

具体文件格式

每条记录占一行
以逗号为分隔符
逗号前后的空格会被忽略
字段中包含有逗号,该字段必须用双引号括起来
字段中包含有换行符,该字段必须用双引号括起来
字段前后包含有空格,该字段必须用双引号括起来
字段中的双引号用两个双引号表示
字段中如果有双引号,该字段必须用双引号括起来
第一条记录,可以是字段名


我们经常将Excel格式的文件保存为csv格式以方便上传和修改,可是当数据中包含逗号和双引号的时候Excel会把该字段用双引号括住并把数据中的"改为"",从而给解析带来了困难。我写了以下函数来解析这样的字符串:

testSplitCSV.java:

import java.util.Vector;
class testSplitCSV{
/**
* Split one line of csv file
* @return a String array results
*/
public static String[] splitCSV(String src) throws Exception{
if (src==null || src.equals("")) return new String[0];
StringBuffer st=new StringBuffer();
Vector result=new Vector();
boolean beginWithQuote = false;
for (int i=0;i<src.length();i++){
char ch = src.charAt(i);
if (ch=='\"'){
if (beginWithQuote){
i++;
if (i>=src.length()){
result.addElement(st.toString());
st=new StringBuffer();
beginWithQuote=false;
}else{
ch=src.charAt(i);
if (ch == '\"'){
st.append(ch);
}else if (ch == ','){
result.addElement(st.toString());
st=new StringBuffer();
beginWithQuote = false;
}else{
throw new Exception("Single double-quote char mustn't exist in filed "+(result.size()+1)+" while it is begined with quote\nchar at:"+i);
}
}
}else if (st.length()==0){
beginWithQuote = true;
}else{
throw new Exception("Quote cannot exist in a filed which doesn't begin with quote!\nfield:"+(result.size()+1));
}
}else if (ch==','){
if (beginWithQuote){
st.append(ch);
}else{
result.addElement(st.toString());
st=new StringBuffer();
beginWithQuote = false;
}
}else{
st.append(ch);
}
}
if (st.length()!=0){
if (beginWithQuote){
throw new Exception("last field is begin with but not end with double quote");
}else{
result.addElement(st.toString());
}
}
String rs[] = new String[result.size()];
for (int i=0;i<rs.length;i++){
rs[i]=(String)result.elementAt(i);
}
return rs;
}

public static void main(String[] args){
String src1= "\"fh,zg\",sdf,\"asfs,\",\",dsdf\",\"aadf\"\"\",\"\"\"hdfg\",\"fgh\"\"dgnh\",hgfg'dfh,\"asdfa\"\"\"\"\",\"\"\"\"\"fgjhg\",\"gfhg\"\"\"\"hb\"";
try {
String[] Ret = splitCSV(src1);
for (int i=0;i<Ret.length;i++){
System.out.println(i+": "+Ret[i]);
}
}
catch(Exception e) {
e.printStackTrace();
}
}
}


/**
* 在很多时候我们都需要将一些数据集合以某种文件格式输出,其中CSV文件输出是一种比较常用的方式.
* 下面是一个简单的实现CSV文件输出的代码,与大家共享.
*/
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForm;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForward;
import org.apache.struts.actions.DispatchAction;
import java.io.PrintWriter;
import javax.servlet.http.HttpSession;


public class CsvUtil extends DispatchAction {

public ActionForward exportCsv(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {

HttpSession session = request.getSession();
//头部
String data = "姓名,电子邮件地址,移动电话,业务电话,业务传真,职务,部门\n";
//具体的数据,可以动态的从数据库中读取
data += "张三,zhangs@163.com,13800000000,010-88889999,010-99998888,部门领导,产品研发部\n";
data += "李四,lis@163.com,13800000001,010-88889999,010-99998888,业务助理,产品研发部\n";
StringBuilder str = new StringBuilder();
str.append(data);
response.setContentType("text/csv");
response.setCharacterEncoding("gb18030");
response
.setHeader("Content-Disposition",
"attachment; filename=\""
+ new String("通讯薄.csv".getBytes("gb18030"),
"iso8859-1") + "\"");
PrintWriter out = response.getWriter();
out.write(str.toString());
out.flush();
out.close();
return null;
}

}


import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringReader;
import java.util.List;

import au.com.bytecode.opencsv.CSVReader;
import au.com.bytecode.opencsv.CSVWriter;
import au.com.bytecode.opencsv.bean.ColumnPositionMappingStrategy;
import au.com.bytecode.opencsv.bean.CsvToBean;

public class CsvDemo {

public static void main(String[] args) throws IOException {

final String[] header = new String[]{"name", "sex", "age"};
final String[][] data = new String[][]{header, {"Lucy", "F", "22"}, {"Tom", "M", "25"}, {"Lily", "F", "19"}};

File tempFile = File.createTempFile("csvWriterTest", ".csv");
tempFile.deleteOnExit();

CSVWriter writer = new CSVWriter(new FileWriter(tempFile));
for (int i = 0; i < data.length; i++) {
writer.writeNext(data[i]);
}
writer.close();

CSVReader reader = new CSVReader(new FileReader(tempFile));
String[] line;
String readline = "";
for (int row = 0; (line = reader.readNext()) != null; row++) {
for (int col = 0; col < line.length; col++) {
if (data[row][col] != null) {
System.out.print(line[col] + (col != line.length - 1 ? "," : ""));
readline = readline + line[col] + (col != line.length - 1 ? "," : " ");
}
}
System.out.println("");
}

ColumnPositionMappingStrategy strat = new ColumnPositionMappingStrategy();
strat.setType(Person.class);
String[] columns = new String[] {"name", "sex", "age"};
strat.setColumnMapping(columns);
CsvToBean csv = new CsvToBean();
List<?> persons = csv.parse(strat, new StringReader(readline));
for (int i = 1; i < persons.size(); i++) {
System.out.println(((Person)persons.get(i)).getName());
System.out.println(((Person)persons.get(i)).getSex());
System.out.println(((Person)persons.get(i)).getAge());
}

reader.close();
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值