夢幻之旅

          DEBUG - 天道酬勤

             :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            671 隨筆 :: 6 文章 :: 256 評論 :: 0 Trackbacks
          import java.io.BufferedReader;
          import java.io.BufferedWriter;
          import java.io.File;
          import java.io.FileNotFoundException;
          import java.io.FileReader;
          import java.io.FileWriter;
          import java.io.IOException;
          import java.util.ArrayList;
          import java.util.List;
          import java.util.logging.Level;
          import java.util.logging.Logger;
          import java.util.regex.Matcher;
          import java.util.regex.Pattern;

          /**
           * 
          @author panhf2003
           * 
          @version 2008/09/05,
           
          */

          public class CsvFileUtil
          {
              
              
          /**
               * 構造,禁止實例化
               
          */
              
          private CsvFileUtil()
              {}
              
              
          public static void main(String[] args)
              {
                  
          try
                  {
                      readCsvFile(
          "d:\\ZD_CUSTOMER_VIEW.csv");
                  }
                  
          catch (FileNotFoundException ex)
                  {
                      Logger.getLogger(CsvFileUtil.
          class.getName()).log(Level.SEVERE,
                              
          null, ex);
                  }
                  
          catch (IOException ex)
                  {
                      Logger.getLogger(CsvFileUtil.
          class.getName()).log(Level.SEVERE,
                              
          null, ex);
                  }
              }
              
              
          /**
               * csv文件讀取<BR/> 讀取絕對路徑為argPath的csv文件數據,并以List返回。
               * 
               * 
          @param argPath
               *            csv文件絕對路徑
               * 
          @return csv文件數據(List<String[]>)
               * 
          @throws FileNotFoundException
               * 
          @throws IOException
               
          */
              
          public static List<String[]> readCsvFile(String argPath)
                      
          throws FileNotFoundException, IOException
              {
                  CsvFileUtil util 
          = new CsvFileUtil();
                  File cvsFile 
          = new File(argPath);
                  List
          <String[]> list = new ArrayList<String[]>();
                  FileReader fileReader 
          = null;
                  BufferedReader bufferedReader 
          = null;
                  
          try
                  {
                      fileReader 
          = new FileReader(cvsFile);
                      bufferedReader 
          = new BufferedReader(fileReader);
                      String regExp 
          = util.getRegExp();
                      
                      String strLine 
          = "";
                      String str 
          = "";
                      
          while ((strLine = bufferedReader.readLine()) != null)
                      {
                          Pattern pattern 
          = Pattern.compile(regExp);
                          Matcher matcher 
          = pattern.matcher(strLine);
                          List
          <String> listTemp = new ArrayList<String>();
                          
          while (matcher.find())
                          {
                              str 
          = matcher.group();
                              str 
          = str.trim();
                              
          if (str.endsWith(","))
                              {
                                  str 
          = str.substring(0, str.length() - 1);
                                  str 
          = str.trim();
                              }
                              
          if (str.startsWith("\"") && str.endsWith("\""))
                              {
                                  str 
          = str.substring(1, str.length() - 1);
                                  
          if (util.isExisted("\"\"", str))
                                  {
                                      str 
          = str.replaceAll("\"\"""\"");
                                  }
                              }
                              
          if (!"".equals(str))
                              {
                                  System.out.print(str 
          + " ");
                                  listTemp.add(str);
                              }
                          }
                          
          // test
                          System.out.println();
                          list.add((String[]) listTemp
                                  .toArray(
          new String[listTemp.size()]));
                      }
                  }
                  
          catch (FileNotFoundException e)
                  {
                      
          throw e;
                  }
                  
          catch (IOException e)
                  {
                      
          throw e;
                  }
                  
          finally
                  {
                      
          try
                      {
                          
          if (bufferedReader != null)
                          {
                              bufferedReader.close();
                          }
                          
          if (fileReader != null)
                          {
                              fileReader.close();
                          }
                      }
                      
          catch (IOException e)
                      {
                          
          throw e;
                      }
                  }
                  
          return list;
              }
              
              
          /**
               * csv文件做成<BR/> 將argList寫入argPath路徑下的argFileName文件里。
               * 
               * 
          @param argList
               *            要寫入csv文件的數據(List<String[]>)
               * 
          @param argPath
               *            csv文件路徑
               * 
          @param argFileName
               *            csv文件名
               * 
          @param isNewFile
               *            是否覆蓋原有文件
               * 
          @throws IOException
               * 
          @throws Exception
               
          */
              
          public static void writeCsvFile(List<String[]> argList, String argPath,
                      String argFileName, 
          boolean isNewFile) throws IOException,
                      Exception
              {
                  CsvFileUtil util 
          = new CsvFileUtil();
                  
          // 數據check
                  if (argList == null || argList.size() == 0)
                  {
                      
          throw new Exception("沒有數據");
                  }
                  
          for (int i = 0; i < argList.size(); i++)
                  {
                      
          if (!(argList.get(i) instanceof String[]))
                      {
                          
          throw new Exception("數據格式不對");
                      }
                  }
                  FileWriter fileWriter 
          = null;
                  BufferedWriter bufferedWriter 
          = null;
                  String strFullFileName 
          = argPath;
                  
          if (strFullFileName.lastIndexOf("\\"== (strFullFileName.length() - 1))
                  {
                      strFullFileName 
          += argFileName;
                  }
                  
          else
                  {
                      strFullFileName 
          += "\\" + argFileName;
                  }
                  File file 
          = new File(strFullFileName);
                  
          // 文件路徑check
                  if (!file.getParentFile().exists())
                  {
                      file.getParentFile().mkdirs();
                  }
                  
          try
                  {
                      
          if (isNewFile)
                      {
                          
          // 覆蓋原有文件
                          fileWriter = new FileWriter(file);
                      }
                      
          else
                      {
                          
          // 在原有文件上追加數據
                          fileWriter = new FileWriter(file, true);
                      }
                      bufferedWriter 
          = new BufferedWriter(fileWriter);
                      
          for (int i = 0; i < argList.size(); i++)
                      {
                          String[] strTemp 
          = (String[]) argList.get(i);
                          
          for (int j = 0; j < strTemp.length; j++)
                          {
                              
          if (util.isExisted("\"", strTemp[j]))
                              {
                                  strTemp[j] 
          = strTemp[j].replaceAll("\"""\"\"");
                                  bufferedWriter.write("\"" + strTemp[j] + "\"");
                              }
                              
          else if (util.isExisted(",", strTemp[j])
                                      
          || util.isExisted("\n", strTemp[j])
                                      
          || util.isExisted(" ", strTemp[j])
                                      
          || util.isExisted("??", strTemp[j]))
                              {
                                  bufferedWriter.write(
          "\"" + strTemp[j] + "\"");
                              }
                              
          else
                              {
                                  bufferedWriter.write(strTemp[j]);
                              }
                              
          if (j < strTemp.length - 1)
                              {
                                  bufferedWriter.write(
          ",");
                              }
                          }
                          bufferedWriter.newLine();
                      }
                  }
                  
          catch (IOException e)
                  {
                      e.printStackTrace();
                  }
                  
          finally
                  {
                      
          try
                      {
                          
          if (bufferedWriter != null)
                          {
                              bufferedWriter.close();
                          }
                          
          if (fileWriter != null)
                          {
                              fileWriter.close();
                          }
                      }
                      
          catch (IOException e)
                      {
                          
          throw e;
                      }
                  }
              }
              
              
          /**
               * 
          @param argChar
               * 
          @param argStr
               * 
          @return
               
          */
              
          private boolean isExisted(String argChar, String argStr)
              {
                  
                  
          boolean blnReturnValue = false;
                  
          if ((argStr.indexOf(argChar) >= 0)
                          
          && (argStr.indexOf(argChar) <= argStr.length()))
                  {
                      blnReturnValue 
          = true;
                  }
                  
          return blnReturnValue;
              }
              
              
          /**
               * 正則表達式。
               * 
               * 
          @return 匹配csv文件里最小單位的正則表達式。
               
          */
              
          private String getRegExp()
              {
                  StringBuffer strRegExps 
          = new StringBuffer();
                  strRegExps.append(
          "\"((");
                  strRegExps.append(SPECIAL_CHAR_A);
                  strRegExps.append(
          "*[,\\n  ])*(");
                  strRegExps.append(SPECIAL_CHAR_A);
                  strRegExps.append(
          "*\"{2})*)*");
                  strRegExps.append(SPECIAL_CHAR_A);
                  strRegExps.append(
          "*\"[  ]*,[  ]*");
                  strRegExps.append("|");
                  strRegExps.append(SPECIAL_CHAR_B);
                  strRegExps.append(
          "*[  ]*,[  ]*");
                  strRegExps.append(
          "|\"((");
                  strRegExps.append(SPECIAL_CHAR_A);
                  strRegExps.append(
          "*[,\\n  ])*(");
                  strRegExps.append(SPECIAL_CHAR_A);
                  strRegExps.append(
          "*\"{2})*)*");
                  strRegExps.append(SPECIAL_CHAR_A);
                  strRegExps.append(
          "*\"[  ]*");
                  strRegExps.append("|");
                  strRegExps.append(SPECIAL_CHAR_B);
                  strRegExps.append(
          "*[  ]*");
                  
          return strRegExps.toString();
              }
              
              
          private static final String SPECIAL_CHAR_A = "[^\",\\n  ]";
              
              
          private static final String SPECIAL_CHAR_B = "[^\",\\n]";
          }
          posted on 2008-12-17 09:31 HUIKK 閱讀(4184) 評論(5)  編輯  收藏

          評論

          # re: java 解析csv文件 2008-12-18 18:52 惠萬鵬
          去掉if (!"".equals(str)) 更合理些.  回復  更多評論
            

          # re: java 解析csv文件[未登錄] 2009-10-12 09:57 Hunter
          讀取CSV文件,遇到空字段就出錯了啊  回復  更多評論
            

          # re: java 解析csv文件 2012-08-09 20:08 poiu
          @惠萬鵬
          @Hunter
          @Hunter
          @Hunter
          @Hunter
          @Hunter
          @Hunter
          @Hunter
          @Hunter
          @Hunter
          @Hunter
          @Hunter
          @Hunter
          @Hunter
          @Hunter
          @Hunter
          @Hunter
          @Hunter
          @Hunter
          @Hunter
          @Hunter
          @Hunter
          @Hunter
          @Hunter
          @Hunter
          嗯 是的  回復  更多評論
            

          # re: java 解析csv文件[未登錄] 2012-08-09 20:45 H
          你是我同事huter嗎?  回復  更多評論
            

          # re: java 解析csv文件 2012-10-18 09:42 白云巖
          private String getRegExp()
          {
          StringBuffer strRegExps = new StringBuffer();
          strRegExps.append("\"((");
          strRegExps.append(SPECIAL_CHAR_A);
          strRegExps.append("*[,\\n  ])*(");
          strRegExps.append(SPECIAL_CHAR_A);
          strRegExps.append("*\"{2})*)*");
          strRegExps.append(SPECIAL_CHAR_A);
          strRegExps.append("*\"[  ]*,[  ]*");
          strRegExps.append("|");
          strRegExps.append(SPECIAL_CHAR_B);
          strRegExps.append("*[  ]*,[  ]*");
          strRegExps.append("|\"((");
          strRegExps.append(SPECIAL_CHAR_A);
          strRegExps.append("*[,\\n  ])*(");
          strRegExps.append(SPECIAL_CHAR_A);
          strRegExps.append("*\"{2})*)*");
          strRegExps.append(SPECIAL_CHAR_A);
          strRegExps.append("*\"[  ]*");
          strRegExps.append("|");
          strRegExps.append(SPECIAL_CHAR_B);
          strRegExps.append("*[  ]*");
          return strRegExps.toString();
          }

          private static final String SPECIAL_CHAR_A = "[^\",\\n  ]";

          private static final String SPECIAL_CHAR_B = "[^\",\\n]";


          這一大塊的正則表達式是什么意思,能詳細解釋一下嗎,謝謝。  回復  更多評論
            


          只有注冊用戶登錄后才能發(fā)表評論。


          網站導航:
           
          主站蜘蛛池模板: 礼泉县| 安化县| 盐城市| 吴忠市| 白水县| 美姑县| 西平县| 昌都县| 彰武县| 嵩明县| 营口市| 册亨县| 玉树县| 达拉特旗| 南丹县| 工布江达县| 松溪县| 原阳县| 合川市| 长泰县| 滕州市| 吕梁市| 江城| 兰州市| 蕲春县| 永泰县| 泽州县| 济源市| 崇礼县| 新田县| 靖宇县| 宝兴县| 康保县| 遂溪县| 玛沁县| 嵊州市| 钟山县| 宣威市| 拜城县| 安图县| 通州市|