解析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 @ 2003-03-01 14:01  emu  阅读(150)  评论(0编辑  收藏  举报