Perl遍历文件中的每一行,并将其附加到另一个文件中每一行的末尾



我有两个文本文件,其中包含以下内容:

FILE1.txt

dog
cat
antelope

FILE2.txt

1
2
Barry

我想要实现的输出如下:

dog1
dog2
dogBarry
cat1
cat2
catBarry
antelope1
antelope2
antelopeBarry

我的做法:

    open (FILE1, "<File1.txt") || die $!;
    open (FILE2, "<File2.txt") || die $!;
    my @animals = (<FILE1>);  #each line of the file into an array
    my @otherStrings = (<FILE2>);   #each line of the file into an array
    close FILE1 || die $!;
    close FILE2 || die $!;
    my @bothTogether;
    foreach my $animal (@animals) {
    chomp $animal;
            foreach my $otherString (@otherStrings) {
                    chomp $otherString;
                    push (@bothTogether,  "$animal$otherString");
            }
   }
   print @bothTogether; 

我这样做是有效的,但我确信这不是最好的方法,尤其是当文件都可能包含数千行时

最好的方法是什么,也许可以使用哈希

您的方法适用于具有数千行的文件。那真的没有那么大。对于数以百万计的线路来说,这可能是个问题。

然而,您可以通过只将一个文件读取到内存中,并立即打印结果而不是将其存储在数组中来减少代码的内存使用:

use warnings;
use strict;
open my $animals, '<', 'File1.txt' or die "Can't open animals: $!";
open my $payloads, '<', 'File2.txt' or die "Can't open payloads: $!";
my @payloads = <$payloads>;   #each line of the file into an array
close $payloads or die "Can't close payloads: $!";
while (my $line = <$animals>) {
    chomp $line;
    print $line.$_ foreach (@payloads);
}
close $animals or die "Can't close animals: $!";

对于两个大小相等的巨大文件,这将使用大约原始代码内存的1/4。

更新:我还编辑了代码,以包含Simbabque对其现代化的良好建议。

更新2:正如其他人所指出的,您无法将两个文件都读取到内存中,在动物文件的每一行上逐行遍历有效载荷文件。然而,这会慢得多。除非绝对必要,否则应该避免。我建议的方法将与原始代码的速度大致相同。

除了某些现代Perl方面(例如两个参数open)之外,您的代码非常直接。

我能看到的唯一改进是,您可以将内部chomp移动到一个额外的循环中,也许可以在读取文件时进行咀嚼。这样可以节省一些时间。但总的来说,如果你想对其他数据的每一行的数据做一些事情,你做得对。

由于优先级的原因,您应该使用or die而不是|| die,并且最终输出将是一条长行,因为数组的项中不再有换行符。

更新:@FrankB在上面的评论中提出了一个很好的建议:如果你的文件很大,并且你的内存很紧张,你不应该把它们拖进去放在两个数组中,而是逐行读取和处理第一行,并为第一行的每一行打开和读取第二行。这需要更长的时间,但节省了大量内存。然后,您也可以直接输出结果,而不是将它们推送到结果数组中。

相关内容

  • 没有找到相关文章

最新更新