我們經常將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(); } } }
|