第二步:把喊弯20个文件放在一个目录下,使用opendir 函数读取目录进行 *** 作,渗蠢例如郑喊闷:
#!/usr/bin/perl
use warnings
use strict
my %hash
open IN, $file1 or die $!
while<IN>
{
$hash{$_}=1
}
my ($dirname, $filename)
$dirname = "E:/xiao/"
open OUT, ">c.txt" or die $i
opendir (DIR, $dirname ) || die "Error in opening dir $dirname\n"
while( ($filename = readdir(DIR))){
open (FILE, "E:/xiao/".$filename)|| die "can not open the file $filename\n"
while (<FILE>){
chomp
if(exists $hash{$_})
{ print OUT "$_\n" }
}
}
closedir(DIR)
没必要用perl,excel就可以了,把其中一列贴到记事本,然后贴回excel里面(记住,贴回去的时候要把所有内容贴到余仿一个单元格里面),然后用find函数就可以找到不同的了。比如说你给出来的是列A和列B。
1.把竖腔纤列A的东西复制到记事本,然后全部贴到C1里面。圆散
2.在D1写公式 "=find(left(B1,4),C$1)", 把这个公式贴到整个B列里面
3.D1的运算结果就表示B1的内容能不能在A列里面找到,D2的运算结果就表示B2的内容能不能在A列里面找到,以此类推
4.直接用菜单里的"数据"->"筛选"->"自动筛选" 选出你要的那些行就行了。
perl脚本如下,执行的结果会放在与表对应的csv文件中, 有些代码折行了,请在折行的代码区域双击一下即可展开。#!/usr/bin/env perl
use strict
use warnings
use DBI
#**** 说明 ****#
# 假设培码:
# 配羡哪 两个database分别为db1, db2
# 两个table分别为tbl1, tbl2
# 从Oracle数据库导出的文件为csv格式(逗号分隔), 分别为tbl1.csv, tbl2.csv
#****执行步骤 ****#
# Step1 连接Oracle数据库
$dbname1="db1"
$dbname2="db2"
$user="user"
$passwd="password"
$dbh1=DBI->connect("DBI:Oracle:$dbname1",$user,$passwd) || die "cannot connect to Oracle:$!\n"
$dbh2=DBI->connect("DBI:Oracle:$dbname2",$user,$passwd) || die "cannot connect to Oracle:$!\n"
# Step2 导出数据库中的tables到csv文件
db_to_csv( $dbh1, 'tbl1.csv', 'SELECT * FROM db1.tbl1' )
db_to_csv( $dbh2, 'tbl2.csv', 'SELECT * FROM db2.tbl2' )
# Step3 断开数据库连接
$dbh1->disconnect
$dbh2->disconnect
# Step4 将比较结果写入文件compare_results.csv中
open( my $fh, '>', 'compare_results.csv' ) or die $!
compare_dump( 'tbl1.csv', 'tbl2.csv', $fh )
close $fh
#**** 以下为一些自定义subroutines ****#
# 从数据库读取数据并导出为csv文件
sub db_to_csv
{
my $dbh = shift
my $file = shift
my $sql = shift
my $sth = $dbh->prepare($sql)
$sth->execute
my $numFields = $sth->{'NUM_OF_FIELDS'}
open( my $fh, '>', $file ) or die $!
while (my $ref = $sth->fetchrow_arrayref) {
my $file
for (my $i = 0 $i < $numFields $i++) {
$line .= $$ref[$i] if(defined $$ref[$i])
$line .= ","
}
printf $fh ( "%s\n", $line )
}
close $fh
}
# 对比两个表并输出同colum不同值的lines
sub compare_dump {
my $file1 = shift
my $file2 = shift
my $fh_result = shift
open( my $fh1, '<', $file1 ) or die $!
open( my $fh2, '<', $file2 ) or 派棚die $!
my (@col1, @col2, @col3, @col4)
while( defined (my $line1 = <$fh1>) ){
chomp $line1
my ($tbl1_col1, $tbl1_col2, $tbl1_col3, $tbl1_col4) = ( $line1 =~ /(\w+), (\w+), (\w+), (\w+)/ )
my $line2 = chomp(<$fh2>)
my ($tbl2_col1, $tbl2_col2, $tbl3_col3, $tbl4_col4) = ( $line1 =~ /(\w+), (\w+), (\w+), (\w+)/ )
if ($tbl1_col1 !~ /$tbl2_col1){
push @col1, [ $tbl1_col1, $tbl2_col1 ]
}
if ($tbl1_col2 !~ /$tbl2_col2){
push @col2, [ $tbl1_col2, $tbl2_col2 ]
}
if ($tbl1_col3 !~ /$tbl2_col3){
push @col3, [ $tbl1_col3, $tbl2_col3 ]
}
if ($tbl1_col4 !~ /$tbl2_col4){
push @col4, [ $tbl1_col4, $tbl2_col4 ]
}
}
close $fh1
close $fh2
# 写入不同的值column1
printf $fh_result ( "%-8s\t%-8s\n", 'AREAID_tbl1', 'AREAID_tbl2' )
for my $ref_elem (@col1) {
printf $fh_result ( "%-8s\t%-8s\n", ${$ref_elem}[0], @${$ref_elem}[1] )
}
# 写入不同的值column2
printf $fh_result ( "%-8s\t%-8s\n", 'CODED_tbl1', 'CODE_tbl2' )
for my $ref_elem (@col2) {
printf $fh_result ( "%-8s\t%-8s\n", ${$ref_elem}[0], @${$ref_elem}[1] )
}
# 写入不同的值column3
printf $fh_result ( "%-8s\t%-8s\n", 'AREANO_tbl1', 'AREANO_tbl2' )
for my $ref_elem (@col3) {
printf $fh_result ( "%-8s\t%-8s\n", ${$ref_elem}[0], @${$ref_elem}[1] )
}
# 写入不同的值column4
printf $fh_result ( "%-8s\t%-8s\n", 'AREANNAME_tbl1', 'AREANNAME_tbl2' )
for my $ref_elem (@col4) {
printf $fh_result ( "%-8s\t%-8s\n", ${$ref_elem}[0], @${$ref_elem}[1] )
}
}
楼主真没素质,写这么多也不给分。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)