程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 導入導出:數據庫導出Txt文本文件格式校驗

導入導出:數據庫導出Txt文本文件格式校驗

編輯:關於SqlServer

一。文本校驗,因為要工作在window,Linux,所以用Java寫app

package com.cttmis;

import Java.io.*;
import Java.util.*;
import Java.text.SimpleDateFormat;

/**
因為客戶導入的數據經常有一些錯誤,為了自動檢查文件而開發
20070907
parm:文件所在路徑 體積限制(M為單位)
cmd: Java com.cttmis.checktxt 目錄 體積限制(300)
異常一:行數據不完整。校驗逗號分隔符號(,)的數量是否一致。(中間折行的也能校驗出)
異常二:存在空行
我現在發現的錯誤是字符字段切斷形成亂碼而造成的。
*/

public class checktxt {
  public static void main(String[] args) {
    System.out.println("//////////////////////////////////////////////////////////////////////////");
    System.out.println("Txt文本校驗工具(Java)v1.01\r\n異常一:行數據不完整。校驗逗號分隔符號(,)的數量在每行是否一致。\r\n"+
                       "       (中間折行的,數據缺少的,都應該能校驗出)\r\n異常二:存在空行(空白行,或跳行)\r\n實際上只要校驗每行的分隔符數量即可。\r\nchengg0769 2007-09-06");
    System.out.println("//////////////////////////////////////////////////////////////////////////");
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd hh:mm");
    Date dates;
    dates= new Date();
    long timebegin=dates.getTime();
    System.out.println("日期:"+ sdf.format(dates));
    System.out.println();


    if (args.length <1) {
      System.out.println("請輸入文件名或者文件夾名稱!");
      return;
    }

    final  char SPLITERCOL = ',';  //列分隔符號
    long FileLengthMax = 300;  //300M限制

    if (args.length ==2){
      FileLengthMax = Long.parseLong(args[1]);
    }

    File[] filelist;

    try
    {
        File f = new File(args[0]);
        if (f.isDirectory())
        {
 &nb

sp;        filelist = f.listFiles(new txtFilenameFilter("txt"));
          System.out.println("文件清單: -----------------------begin----------------------------");
          printFileNameArray(filelist); //Out print file name
          System.out.println("文件清單: -----------------------end------------------------------");
          System.out.println();

          FileReader fr;
          BufferedReader br;
          String LineString; //單行數據
          String LastLineString; //上行數據,便於比較

          int TotalRows =0;
          int QtyCommaPerLine = 0;  //標准分隔符數量
          int QtyComma = 0;  //標准分隔符數量
          int ErrCount = 0;  //錯誤計數器
          int SleepIdle=0;

          for (int i = 0; i < filelist.length; i++) {
            if (filelist[i].length() > 1000000*FileLengthMax){
              System.out.println("體積超過限制的:" + FileLengthMax + "M,程序不檢查,進入下一個!");
              continue;
            }
          Thread.sleep(1000);
          fr = new FileReader(filelist[i]);
          br = new BufferedReader(fr);

          SleepIdl

e = 0;
          TotalRows =0;
          ErrCount = 0;
          LineString = "";
          LastLineString = "";
          System.out.println(filelist[i].getName() + " -----------------begin--------------");
          while ( (LineString = br.readLine()) != null) {
               switch (++TotalRows)
                  {
                  case 1:
                 &nbsp;    //取得參考值
                      QtyCommaPerLine = QtyCharInString(LineString,SPLITERCOL);
                      LastLineString = LineString;
                      break;
                  default:
                      QtyComma = QtyCharInString(LineString,SPLITERCOL);
                      //異常一:行數據不完整。校驗逗號分隔符號(,)的數量是否一致。
                      //(中間折行的也能校驗出)

  if (QtyComma != QtyCommaPerLine)
                       {
                         ErrCount++;
                         System.out.println(filelist[i].getName() + " 行: "+ TotalRows++ + " 分隔符數量異常!標准數量:" +
                                            QtyCommaPerLine + " 實際數量: " + QtyComma);
                         System.out.println("  上一行>>"+ LastLineString);
                         System.out.println("  錯誤行>>"+ LineString);
                       }
                      //異常二:存在空行
                      else if (LineString == "")
                       {
                         ErrCount++;
                         System.out.println("  上一行>>"+ LastLineString);
                         System.out.println(filelist[i].getName() + " 行: "+ TotalRows++ + " 該行為空白行!");
                       }
                       LastLineString = LineString;
                       if (SleepIdle++ ==100000)
                       {
                       Thread.sleep(100);
                       SleepIdle = 0;
                       }
                  }
            }
            if (ErrCount == 0)
            {
              System.out.println(filelist[i].getName() + " 通過校驗,OK");
            }
            else
            {
           &nbsp;  System.out.println(filelist[i].getName() + " 存在異常:共 " + ErrCount + " 行");
            }


            System.out.println(filelist[i].getName() + "總行數: " + TotalRows+
                              "  錯誤行數: " + ErrCount + " -----------------end----------------");
            System.out.println();
            br.close();
          }
        }
        long timeend=new Date().getTime();
        System.out.println("工作耗時:"+(timeend - timebegin)/1000 + "秒");
        System.gc();

    }catch(Exception e)
    {
        e.printStackTrace();
    }
  }
  static void printFileNameArray(File[] filelist)
  {
      for(int i=0;i<filelist.length;i++)
      {
          System.out.println(filelist[i].getName());
      }
  }

  //查找某個字符在字符穿中出現的個數
  static int QtyCharInString(String s,char c)
  {
    int   count   =   0;
    for(int i=0;i<s.length();i++)
    {
      if(s.charAt(i)==c)
        count++;
    }
    return   count;
  }
}

//filter interface class
class txtFilenameFilter implements FilenameFilter
{
   String ext;

   txtFilenameFilter(String ext){
      this.ext= "." +ext;
    }

    public boolean accept(File dir,String name)
    {
      return name.endsWith(ext);
    }

}

二。bat批處理(window下)

1. 不輸出文本,只作屏幕顯示:

@@echo off

set path = "%path%;C:\Program Files\Java\j2re1.4.2_04\bin"

Java -classpath "%classpath%;." com.cttmis.checktxt E:\FTPFILE
pause

2. 作檢查並輸出到err.log

@@echo off

set path = "%path%;C:\Program Files\Java\j2re1.4.2_04\bin"

Java -classpath "%classpath%;." com.cttmis.checktxt E:\FTPFILE >>err.log
pause

//Note: "%classpath%;." 後面的點代表當前路徑,這樣不用關心class文件的路徑名。

//這是一個習作,是學習Java的第一個程序。也許有不足的地方。



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved