我在一个目录中有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
}
我现在的问题是文件没有以正确的顺序打开,但是在文件1之后文件100被打开。 任何人都可以给我一个提示,告诉我如何以正确的顺序读取文件?
谢谢你, CA
答案 0 :(得分:4)
使用Sort::Key::Natural natsort
自然地对文件进行排序。
以下内容会自动对文件进行自动排序,将名称的字母和数字部分分开,以便适当的排序逻辑。
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
答案 1 :(得分:3)
您可以使用Schwartzian transform一步读取和排序文件,
my @files =
map { $_->[0] }
sort { $a->[1] <=> $b->[1] }
map { [ $_, /(\d+)/ ] } <Temp*.csv>;
或使用效率较低,更直接的排序,
my @files = sort { ($a =~ /(\d+)/)[0] <=> ($b =~ /(\d+)/)[0] } <Temp*.csv>;
答案 2 :(得分:3)
如果这些数字非常重要,您可能希望在文件名后专门阅读这些数字,并提供有关丢失文件的错误报告:
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;
另一方面,如果您控制打印文件的过程,您可以选择一种自动排序的格式,例如:
temp00001.csv
temp00002.csv
temp00003.csv
temp00004.csv
...
temp00101.csv