如何用perl读取一个文件夹下的大量首列相同的txt文件,要进行列合并。

急求~~~!!!如何用perl处理500多个的首列相同的txt文件,要进行列合并。
每个txt文件行数相同,只有2列数据。需要把每一个文件第二列数据按列合并成一个txt文件~

第1个回答  2014-03-07
二维数组
把每个文件的每一行split成两个元素,然后把第二个元素(也就是第二列的数据)加到二维数组中,并且保证不同文件中行数相同的列在同一个子数组中(说的有点绕,希望你懂)。输出的时候直接用换行符join
第2个回答  推荐于2016-11-17
opendir D,"1" or die $!; #把所有txt文件都放到一个叫1的文件夹中
@array=grep(/\.txt/,readdir D);
foreach $list(@array){
open F, "1/$list" or die $!;
@load=<F>;
foreach (@load){ ($s1,$s2)=split/\s+/,$_;push @new,$s2;}
              }
foreach(@new){print "$_\n";}

本回答被提问者采纳
第3个回答  2014-03-07
目录 :/dir/
文件:a1.txt,a2.txt,a3.txt...an.txt
代码:
$files = globe("/dir/*.txt");
%res
foreach $file($files){
$FH= IO::File->new("<$file");
whlie($line = $FH->getline()){
($key,$value) = split(/\s+/,$line);
@array = $res{$key};//严谨点加个undef判断吧,懒得写了

push(@array,$value);

$res{$key} = @array;
undef @array;

}
}
$out = IO::File->new(">res.txt")
foreach $key (keys(%res)){
$out->print("$key ".join(" ",$res{$key})."\n");
}
供参考追问

文件共有110M能在windows下运行么

追答

理论上可以运行。IO::File->getline()是逐行读取,占用内存不算太大。
你尝试运行一下不就知道了。
文件数量比较多,可以加一行用来debug
$files = globe("/dir/*.txt");
%res
foreach $file($files){
print("$file");//加一行打印文件名,可以了解是否一直在执行。免得进程死了都不知道
$FH= IO::File->new("getline()){
($key,$value) = split(/\s+/,$line);
@array = $res{$key};//严谨点加个undef判断吧,懒得写了

push(@array,$value);

$res{$key} = @array;
undef @array;

}
}
$out = IO::File->new(">res.txt")
foreach $key (keys(%res)){
$out->print("$key ".join(" ",$res{$key})."\n");
}

追问

十分感谢~膜拜大神,我先去试试看~

本回答被网友采纳