Free Programming

我的生活在一行又一行的代码中前行........

 

CSV文件格式 解析csv格式的java函数

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

  • 解析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 2007-04-18 01:42  sharewind  阅读(3746)  评论(0编辑  收藏  举报

    导航