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