有一表格需要进行格式化处理,其要求如下:
- 档案编号重复 少部分在xls文件中,大部分与数据库冲突。
- 日期格式错误 正确格式:xxxx-xx-xx
- 所有汉字的空格问题
- 非法性别 除了男女之外
code
程序如下:
#! /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";
}
}
}