使用Perl对Excel进行处理
发布时间:2020-12-15 21:03:17 所属栏目:大数据 来源:网络整理
导读:本程序版权归xiaobin所有。 有一表格需要进行格式化处理,其要求如下: 1. 档案编号重复 ? ? 少部分在xls文件中,大部分与数据库冲突。 2. 日期格式错误 ? ? 正确格式:xxxx-xx-xx 3. 所有汉字的空格问题 4. 非法性别 ? ? 除了男女之外 程序如下: #! /usr/b
本程序版权归xiaobin所有。 有一表格需要进行格式化处理,其要求如下: 1. 档案编号重复 程序如下: #! /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,$oWkC); for(my $iSheet=0; $iSheet < $oBook->{SheetCount}; $iSheet++) { $oWkS = $oBook->{Worksheet}[$iSheet]; my $sn = 0; print "序号t建档日期t性别t出生日期rn"; print "====t==========t====t==========rn"; 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 "rn"; } print "============ 共处理 $sn 行数据 ============rn"; } } ############################################################################### # 模块说明:子程序 # # 功能说明:检查日期格式 # $_[0] == 4 为检查第4列的数据(0,1,2,3,4) # $_[0] == 7 为检查第7列的数据(0,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$8t"; } } 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$8t"; } else { print "not match.t"; } } } ############################################################################### # 模块说明:子程序 # # 功能说明:检查性别 # (男,女) # $_[0] == 5 为检查第4列的数据(0,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 "Unknowt"; } else { print Encode::encode("CP936",$1).",t"; } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |