emu in blogjava

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            171 隨筆 :: 103 文章 :: 1052 評論 :: 2 Trackbacks
          解析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 2005-05-18 16:13 emu 閱讀(4297) 評論(3)  編輯  收藏 所屬分類: java技術

          評論

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

          # re: 解析csv格式的java函數 2006-06-14 14:22 emu
          應網友的要求又用javascript實現了一個。用了正則雖然編碼方便一些,但是難以描述錯誤的格式,所以只能處理結構正確的csv了,而且某些特殊的情況下也有可能解析錯誤:

          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>")
            回復  更多評論
            

          # re: 解析csv格式的java函數 2010-05-24 21:35 冰河快狼
          不錯,收藏一下  回復  更多評論
            

          主站蜘蛛池模板: 岚皋县| 江永县| 贵阳市| 灵丘县| 梁平县| 芜湖县| 包头市| 凤冈县| 磐安县| 广水市| 丘北县| 体育| 铜鼓县| 南雄市| 新竹县| 怀远县| 舒城县| 宝山区| 岳阳县| 龙川县| 淮阳县| 安远县| 新蔡县| 新巴尔虎左旗| 桑植县| 无为县| 涞源县| 镇巴县| 全南县| 承德市| 雷波县| 依安县| 崇左市| 肇东市| 惠东县| 阿拉尔市| 田林县| 永平县| 淮安市| 莒南县| 信宜市|