夢幻之旅

          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]";


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


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


          網站導航:
           
          主站蜘蛛池模板: 武义县| 本溪市| 南木林县| 炎陵县| 五指山市| 饶平县| 阿图什市| 阳朔县| 镇原县| 图们市| 云龙县| 湾仔区| 达日县| 昔阳县| 阜阳市| 淮南市| 固镇县| 修水县| 东山县| 汾西县| 错那县| 清镇市| 泌阳县| 鄂伦春自治旗| 武功县| 龙州县| 浦东新区| 兴海县| 琼海市| 栾城县| 丹寨县| 准格尔旗| 仲巴县| 铜山县| 广汉市| 河曲县| 荥经县| 炉霍县| 合阳县| 朝阳区| 定州市|