<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    emu in blogjava

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

     

    我們經(jīng)常將Excel格式的文件保存為csv格式以方便上傳和修改,可是當數(shù)據(jù)中包含逗號和雙引號的時候Excel會把該字段用雙引號括住并把數(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 閱讀(4296) 評論(3)  編輯  收藏 所屬分類: java技術(shù)

    評論

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

    # re: 解析csv格式的java函數(shù) 2006-06-14 14:22 emu
    應(yīng)網(wǎng)友的要求又用javascript實現(xiàn)了一個。用了正則雖然編碼方便一些,但是難以描述錯誤的格式,所以只能處理結(jié)構(gòu)正確的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>")
      回復(fù)  更多評論
      

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

    主站蜘蛛池模板: 免费三级毛片电影片| 免费在线观看视频网站| 成人免费看片又大又黄| 久久久久亚洲AV无码观看| 一级毛片免费视频网站| 国产精品无码一区二区三区免费| 久久久久亚洲国产| 性感美女视频免费网站午夜| 国产亚洲精品影视在线| 在线看片人成视频免费无遮挡| 中文字幕在线日亚洲9| 免费无码一区二区三区蜜桃大 | 亚洲白色白色永久观看| 美女视频黄a视频全免费网站色窝 美女被cao网站免费看在线看 | 亚洲AV无码AV男人的天堂不卡| 在线jyzzjyzz免费视频| 亚洲欧美日韩中文高清www777| 国产网站免费观看| 看Aⅴ免费毛片手机播放| 国产自偷亚洲精品页65页| a级毛片免费高清毛片视频| 亚洲国产精品无码成人片久久| 国产一精品一AV一免费| 中文字幕亚洲色图| 114一级毛片免费| 国产亚洲精品免费| 亚洲综合伊人久久大杳蕉| 无码专区AAAAAA免费视频| 亚洲精品在线播放视频| 浮力影院第一页小视频国产在线观看免费 | 免费看美女让人桶尿口| 一级特黄录像免费播放中文版| 亚洲国产精品国自产拍AV| 在线看片韩国免费人成视频| 亚洲AV成人精品一区二区三区| 激情97综合亚洲色婷婷五| 91精品免费国产高清在线| 免费看又黄又爽又猛的视频软件| 亚洲av一综合av一区| 毛片免费观看网站| 中文字幕免费在线播放|