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

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

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

    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 冰河快狼
    不錯,收藏一下  回復  更多評論
      

    主站蜘蛛池模板: 国产精品极品美女免费观看| 女bbbbxxxx另类亚洲| 亚洲伊人久久综合影院| 中文字幕av无码无卡免费| 美女视频黄a视频全免费网站色窝| 亚洲人成未满十八禁网站| 久久亚洲国产伦理| 国产亚洲欧洲Aⅴ综合一区| 日韩伦理片电影在线免费观看| 免费看片在线观看| 久久精品免费电影| 免费一区二区无码东京热| 一级A毛片免费观看久久精品 | 国产免费福利体检区久久| 毛片亚洲AV无码精品国产午夜| 亚洲国产精品yw在线观看| 久久精品7亚洲午夜a| 久久久久久亚洲精品不卡| 亚洲精品成人网久久久久久| 国产一级高清视频免费看| 好吊妞在线新免费视频| 国产美女在线精品免费观看| 国产1000部成人免费视频| 最近免费2019中文字幕大全| 一级毛片免费毛片一级毛片免费| 中文字幕免费在线看线人动作大片 | 无码久久精品国产亚洲Av影片| 亚洲综合色视频在线观看| 亚洲AV无码乱码在线观看牲色| 美女被免费视频网站a国产| 免费无遮挡无码视频网站| 色吊丝最新永久免费观看网站 | 亚洲精品无码久久久久久久 | 最近最新高清免费中文字幕| 污污网站免费观看| 99热这里有免费国产精品| 日本xxxx色视频在线观看免费| 久久aa毛片免费播放嗯啊| 在线观看免费av网站| 五月亭亭免费高清在线| 国产成人无码免费看视频软件|