以正确的顺序读入编号的文件

时间:2014-09-09 13:13:12

标签: 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
    }  

我现在的问题是文件没有以正确的顺序打开,但是在文件1之后文件100被打开。 任何人都可以给我一个提示,告诉我如何以正确的顺序读取文件?

谢谢你, CA

3 个答案:

答案 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