用perl处理文件:比如我想比较文件A和文件B1,B2,……B20,找到相同的内容输出到文件C.怎么同时比较?

用perl处理文件:比如我想比较文件A和文件B1,B2,……B20,找到相同的内容输出到文件C.怎么同时比较?,第1张

第一步: 把文件A 的内容存入 哈希中;

第二步:把喊弯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] )

    }

}

楼主真没素质,写这么多也不给分。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8156688.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存