emu in blogjava

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  171 随笔 :: 103 文章 :: 1052 评论 :: 2 Trackbacks
解析csv格式的java函数

 

我们经常将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();
  }
 }
}

posted on 2005-05-18 16:13 emu 阅读(4262) 评论(3)  编辑  收藏 所属分类: java技术

评论

# re: 解析csv格式的java函数 2006-03-07 09:18 油l葫芦
你的方法的确很轻量级。
之前的一个项目用到csvjdbc(http://sourceforge.net/projects/csvjdbc),提供了Java 访问 csv 文件的的 JDBC 驱动,它其实是把一个 csv 文件当做一个数据库表来操作,提供简单的查询  回复  更多评论
  

# re: 解析csv格式的java函数 2006-06-14 14:22 emu
应网友的要求又用javascript实现了一个。用了正则虽然编码方便一些,但是难以描述错误的格式,所以只能处理结构正确的csv了,而且某些特殊的情况下也有可能解析错误:

var st = 'asdf,"""asd,fgg""","asd""fgh","as""d,f""gh",ab cd ef\nasdf,"asd"",""fgg","asd""fgh","as""d,f""gh",ab cd ef\nasdf,"asd,fgg","asd""fgh","as""d,f""gh",ab cd ef';

st = st.replace(/([^,])""([^,])/g,"$1$quote;$2")
st = st.replace(/""/g,"$quote;")
st = st.replace(/,"/g,",$left;")
st = st.replace(/",/g,"$right;,")
var ar = st.split("\n");
var result = [];
for(var i=0;i<ar.length;i++){
var a= ar[i].split(",");
for(var j=0;j<a.length;j++){
if(/\$left;/.test(a[j]) && !(/\$right;/.test(a[j]))){
a[j]=a[j]+","+a[j+1];
a.splice(j+1,1);
j--;
}else{
a[j]=a[j].replace(/(\$left;)|(\$right;)/g,"").replace(/\$quote;/g,'"');
}
}
result[i]= a;
}
document.write("<table border=1>")
for(var i=0;i<result.length;i++){
document.write("<tr>");
for(var j=0;j<result[i].length;j++)
document.write("<td>"+result[i][j]+"</td>");
document.write("</tr>");
}
document.write("</table>")
  回复  更多评论
  

# re: 解析csv格式的java函数 2010-05-24 21:35 冰河快狼
不错,收藏一下  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: