Perl实例---合并文件

Posted EasyPerl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Perl实例---合并文件相关的知识,希望对你有一定的参考价值。

题目:我们有以下2个文件, 我们需要根据其b列来将数据进行合并

test.txt

a b c d

1 2 3 4

dd 3 as dgasfew

12 4 dfa reafda

123 5 df reafd


text2.txt

h f j b

1 2 3 4

dd 3 as 3

12 4 dfa 2


分析:我们需要针对b列来比较,从而合并2个文件中b列相同的数据, 这种情况下, 我们可以使用散列这个数据结构来完成我们的目标:


定义变量

my %hash;

my $head;

my $index1;

my $index2;


读取文件

open my $fh1, '<', 'test.txt' or die "failed to open test.txt\n";

open my $fh2, '<', 'test2.txt' or die "failed to open test2.txt\n";


将文件1的内容存入散列中, 其中key是b列的数据, value是整行数据

while(<$fh1>){

chomp;

         提取表头

if ($. == 1){

$head = $_;

my @labels = split /\s+/, $_;

                 获取b列的位置

for my $label(@labels){

last if $label eq 'b';

$index1++;

}

next;

}

        将数据存入散列中

my @vals = split /\s+/, $_;

my $key = $vals[$index1];

$hash{$key} = $_;

}

close $fh1;


对于test2的数据, 我们不需要再进行存储, 我们只需要读取一行直接处理一行, 因此在处理中, 我们往往选择小的那个文件存入散列中, 因为这样可以占用更小的内存

while(<$fh2>){

chomp;

if ($. == 1){

print "$head\t$_\n";

my @labels = split /\s+/, $_;

for my $label(@labels){

last if $label eq 'b';

$index2++;

}

next;

}

    

my @vals = split /\s+/, $_;

my $key = $vals[$index2];

        如果b列的值同时存在于2个文件中, 则合并拼接此行文件

if($hash{$key}){

print "$hash{$key}\t$_\n";

}


}



close $fh2;


以上是关于Perl实例---合并文件的主要内容,如果未能解决你的问题,请参考以下文章

#Perl#使用perl合并多个文本

Perl如何将两个或多个excel文件合并为一个(多个工作表)?

Perl实例---最小空间使用情况下合并有序数组

Perl 嵌套哈希匹配和合并

创建一个 perl 脚本来批处理文件

Java实现文件分割和文件合并实例