emu in blogjava

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            171 隨筆 :: 103 文章 :: 1052 評(píng)論 :: 2 Trackbacks
          解析csv格式的java函數(shù)

           

          我們經(jīng)常將Excel格式的文件保存為csv格式以方便上傳和修改,可是當(dāng)數(shù)據(jù)中包含逗號(hào)和雙引號(hào)的時(shí)候Excel會(huì)把該字段用雙引號(hào)括住并把數(shù)據(jù)中的"改為"",從而給解析帶來了困難。我寫了以下函數(shù)來解析這樣的字符串:

          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 閱讀(4297) 評(píng)論(3)  編輯  收藏 所屬分類: java技術(shù)

          評(píng)論

          # re: 解析csv格式的java函數(shù) 2006-03-07 09:18 油l葫蘆
          你的方法的確很輕量級(jí)。
          之前的一個(gè)項(xiàng)目用到csvjdbc(http://sourceforge.net/projects/csvjdbc),提供了Java 訪問 csv 文件的的 JDBC 驅(qū)動(dòng),它其實(shí)是把一個(gè) csv 文件當(dāng)做一個(gè)數(shù)據(jù)庫表來操作,提供簡單的查詢  回復(fù)  更多評(píng)論
            

          # re: 解析csv格式的java函數(shù) 2006-06-14 14:22 emu
          應(yīng)網(wǎng)友的要求又用javascript實(shí)現(xiàn)了一個(gè)。用了正則雖然編碼方便一些,但是難以描述錯(cuò)誤的格式,所以只能處理結(jié)構(gòu)正確的csv了,而且某些特殊的情況下也有可能解析錯(cuò)誤:

          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>")
            回復(fù)  更多評(píng)論
            

          # re: 解析csv格式的java函數(shù) 2010-05-24 21:35 冰河快狼
          不錯(cuò),收藏一下  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 溧阳市| 互助| 忻城县| 乐东| 深水埗区| 姚安县| 海盐县| 菏泽市| 灵武市| 赤城县| 洮南市| 玉林市| 渝中区| 米脂县| 保山市| 英德市| 陕西省| 阜康市| 新晃| 外汇| 和硕县| 蓝山县| 田东县| 云和县| 墨玉县| 九江县| 崇文区| 重庆市| 凤城市| 商南县| 临泉县| 双柏县| 化德县| 公安县| 曲周县| 吉林省| 京山县| 中江县| 大姚县| 怀安县| 徐州市|