了解知识
有一表格需要进行格式化处理,其要求如下:
 
1. 档案编号重复
    少部分在xls文件中,大部分与数据库冲突。
2. 日期格式错误
    正确格式:xxxx-xx-xx
3. 所有汉字的空格问题
4. 非法性别
    除了男女之外
 
程序如下:
 
[php] view plaincopy
#! /usr/bin/perl  
  
###############################################################################  
# Author:               **斌  
# Date:                 2012-02-22  
# Version:              V0.1  
###############################################################################  
  
###############################################################################  
# Modified by:          xiaobin (XB)  
# Modified date:        2012-03-31  
# Version:              V0.3  
###############################################################################  
  
###############################################################################  
# Modified by:          xiaobin (XB)  
# Modified date:        2012-04-01  
# Version:              V0.4  
###############################################################################  
  
###############################################################################  
# Modified by:            
# Modified date:          
# Version:                
###############################################################################  
  
###############################################################################  
# 版权说明:                                                                  #  
#           本程序版权归李贵斌所有,解释权属于所有者。                        #  
#           作为一个整体使用时,请附带以上说明。                              #  
#                                                                             #  
#           本程序完全免费使用。                                              #  
###############################################################################  
   
###############################################################################  
#                               使用说明                                      #  
###############################################################################  
#                                                                             #  
#   命令行:perl processData.PL xxx.xls >> xxx.txt                            #  
#                                                                             #  
#   参数解释:                                                                #  
#           1. xxx.xls 为要进行处理的Excel文件名                              #  
#           2. >> 为管道符号                                                  #  
#           3. xxx.txt 为要保存的文件                                         #  
#                                                                             #  
###############################################################################  
  
  
use strict;  
use warnings;  
use Encoding;  
  
use Spreadsheet::ParseExcel;  
use Spreadsheet::ParseExcel::FmtUnicode;  
  
  
  
###############################################################################  
# 主程序  
#  
###############################################################################  
my $oExcel = Spreadsheet::ParseExcel->new;  
die "You must provide a filename to $0"  
        ."to be parsed as an Excel file" unless @ARGV;  
   
#set for charactor  
my $oFmtC = Spreadsheet::ParseExcel::FmtUnicode->new(Unicode_Map => "GB2312");  
  
if($#ARGV < 0) {  
    exit;  
}  
  
my $oBook = $oExcel->Parse($ARGV[0], $oFmtC);  
my($iR, $iC, $oWkS, $oWkC);  
  
PrnBook($oBook);  
  
  
###############################################################################  
# 主子程序  
#  
###############################################################################  
sub PrnBook {  
    my($oBook) = @_;  
    my($iR, $iC, $oWkS, $oWkC);  
  
    for(my $iSheet=0; $iSheet < $oBook->{SheetCount}; $iSheet++) {  
        $oWkS = $oBook->{Worksheet}[$iSheet];  
          
        my $sn = 0;  
          
        print "序号\t建档日期\t性别\t出生日期\r\n";  
        print "====\t==========\t====\t==========\r\n";  
          
        for(my $iR = $oWkS->{MinRow};   
                defined $oWkS->{MaxRow} && $iR < $oWkS->{MaxRow} + 1; $iR++) {  
            $sn = $iR + 1;  
            print "$sn,\t";   
                      
            for(my $iC = $oWkS->{MinCol};  
                        defined $oWkS->{MaxCol} && $iC < $oWkS->{MaxCol} + 1;   
                        $iC++) {  
                                  
                $oWkC = $oWkS->{Cells}[$iR][$iC];  
                  
                checkDateFmt($iC, $oWkC);  
                check2Sex($iC, $oWkC);  
            }  
              
            print "\r\n";  
        }  
        print "============ 共处理 $sn 行数据 ============\r\n";  
    }  
}  
  
###############################################################################  
# 模块说明:子程序  
#  
# 功能说明:检查日期格式  
#           $_[0] == 4 为检查第4列的数据(0, 1, 2, 3, 4)  
#           $_[0] == 7 为检查第7列的数据(0, 1, 2, 3, 4, 5, 6, 7)  
###############################################################################  
sub checkDateFmt {  
    if ($_[0] == 4 || $_[0] == 7) {  
          
        if ($_[1]->Value =~ m{ \s }xms) {  
             die "Not Value!";  
        }  
          
        if ($_[1]->Value =~   
            m{  
                ^  
                ([1-9]) ([0-9]) ([0-9]) ([0-9])     # Year  
                [-] +                               # -  
                ([0-9]) ([0-9])                     # Month  
                [-] +                               # -  
                ([0-9]) ([0-9])                     # Day  
                $  
            }xms  
            ) {  
            if ($_[0] == 4) {  
                print "$1$2$3$4-$5$6-$7$8,\t";  
            }  
            else {  
                print "$1$2$3$4-$5$6-$7$8\t";  
            }  
        }  
        elsif ($_[1]->Value =~   
            m{  
                ^  
                ([1-9]) ([0-9]) ([0-9]) ([0-9])     # Year  
                [-] ?                               # -  
                ([0-9]) ([0-9])                     # Month  
                [-] ?                               # -  
                ([0-9]) ([0-9])                     # Day  
                $  
            }xms  
            ) {  
            print "$1$2$3$4-$5$6-$7$8\t";  
        }  
        else {  
            print "not match.\t";  
        }  
          
    }  
}  
  
###############################################################################  
# 模块说明:子程序  
#  
# 功能说明:检查性别  
#           (男, 女)  
#           $_[0] == 5 为检查第4列的数据(0, 1, 2, 3, 4, 5)  
###############################################################################  
sub check2Sex {  
    my $strMan = Encode::decode("CP936", "男");  
    my $strWoman = Encode::decode("CP936", "女");  
      
    if ($_[0] == 5) {  
        unless (Encode::decode("CP936", $_[1]->Value) =~   
            m{  
                ( $strMan | $strWoman )  
            }xms  
            ) {  
            print "Unknow\t";  
        }  
        else {  
            print Encode::encode("CP936", $1).",\t";  
        }  
    }  
}  
标签: perl
扩展知识