Perl 按正确顺序读入带编号的文件
我在一个目录中有1500个文件,我需要从每个目录中获取一些信息,并将其写入一个新的单个文件。文件名由一个单词和一个数字(Temp1、Temp2、Temp3等)组成,根据数字以正确的顺序读取文件非常重要。 我是用Perl 按正确顺序读入带编号的文件,perl,Perl,我在一个目录中有1500个文件,我需要从每个目录中获取一些信息,并将其写入一个新的单个文件。文件名由一个单词和一个数字(Temp1、Temp2、Temp3等)组成,根据数字以正确的顺序读取文件非常重要。 我是用 my @files = <Temp*.csv>; for my $file (@files) { this part appends the required data to a seperate file and works fine }
my @files = <Temp*.csv>;
for my $file (@files)
{
this part appends the required data to a seperate file and works fine
}
my@files=;
对于我的$file(@files)
{
这部分将所需的数据附加到一个单独的文件中,工作正常
}
我现在的问题是,文件没有以正确的顺序打开,但是在文件1之后,文件100被打开。
谁能给我一个提示,我怎样才能让它按正确的顺序读取文件
谢谢,,
Ca您可以使用它一步读取和排序文件
my @files =
map { $_->[0] }
sort { $a->[1] <=> $b->[1] }
map { [ $_, /(\d+)/ ] } <Temp*.csv>;
my@files=
映射{$\->[0]}
排序{$a->[1]$b->[1]}
映射{[$\uu1,/(\d+/]);
或者使用效率更低、更直接的排序
my @files = sort { ($a =~ /(\d+)/)[0] <=> ($b =~ /(\d+)/)[0] } <Temp*.csv>;
my@files=sort{($a=~/(\d+)/)[0]($b=~/(\d+)/)[0]};
如果数字确实很重要,您可能希望在文件名之后读取它们,并报告丢失文件的错误:
my @nums = 1 .. 1500; # or whatever the highest is
for my $num (@nums) {
my $file = "Temp$num.csv";
unless (-e $file) {
warn "Missing file: $file";
next;
}
...
# proceed as normal
}
如果需要文件计数,只需使用旧glob即可:
my @files = <Temp*.csv>;
my $count = @files; # get the size of the array
my @nums = 1 .. $count;
按顺序对文件进行自然排序 下面将自动自然地对文件进行排序,将名称的字母和数字部分分离出来,以便进行适当的排序逻辑
use strict;
use warnings;
use Sort::Key::Natural qw(natsort);
for my $file ( natsort <Temp*.csv> ) {
# this part appends the required data to a seperate file and works fine
}
或者不使用ST:
my@files=sort{($a=~/(\d+)/)[0]($b=~/(\d+)/)[0]}代码>在较长的列表中速度较慢,但对于典型的使用,您不会注意到差异。Schwartzian变换是一种优化,在编写和测试代码之前,不应使用它,因为代码速度太慢,并且分析后发现排序是一个瓶颈。没有转换的版本不必要地将自身限制在单个表达式中,而且非常不清晰。2017年最明显的解决方案是使用List::UtilsBy::nsort_by
@Schwern你能在上面的评论中发表你的意见吗?Tnx。
use strict;
use warnings;
use Sort::Key::Natural qw(natsort);
for my $file ( natsort <Temp*.csv> ) {
# this part appends the required data to a seperate file and works fine
}
use strict;
use warnings;
use Sort::Key::Natural qw(natsort);
print natsort <DATA>;
__DATA__
Temp100.csv
Temp8.csv
Temp20.csv
Temp1.csv
Temp7.csv
Temp1.csv
Temp7.csv
Temp8.csv
Temp20.csv
Temp100.csv