Perl - 排序文件名中包含日期值的文件

时间:2015-05-13 16:36:37

标签: regex perl sorting csv

我在目录中有一个文件列表,我想对其执行排序并获取最新文件。我不想使用最新的修改时间或创建时间。我想根据文件名进行排序。

文件名的格式为 DEV_TEST_DDMMYYYYHH24MISS.csv

我需要编写一个perl脚本,它将从目录中读取文件并根据文件名执行排序。

EX。文件名:

DEV_TEST_24032015121022.csv 
DEV_TEST_04052015074942.csv 
DEV_TEST_12052015074942.csv 
DEV_TEST_05052015115948.csv
DEV_TEST_12022015115948.csv

脚本应返回DEV_TEST_12052015074942.csv作为最新文件。

有人可以提出更好的方法吗?

如果有人可以提供排序逻辑就足够了。

3 个答案:

答案 0 :(得分:2)

您可以使用Time::Piece模块解析文件名中的数字以及List::UtilsBy中的nsort_by来命令您的文件名

看起来像这样

use strict;
use warnings;
use 5.010;

use Time::Piece;
use List::UtilsBy 'nsort_by';

my @names = <DATA>;
chomp @names;

my @sorted = nsort_by { Time::Piece->strptime(/(\d+)/, '%d%m%Y%H%M%S')->epoch } @names;

say for @sorted;

__DATA__
DEV_TEST_24032015121022.csv
DEV_TEST_04052015074942.csv
DEV_TEST_12052015074942.csv
DEV_TEST_05052015115948.csv
DEV_TEST_12022015115948.csv

<强>输出

DEV_TEST_12022015115948.csv
DEV_TEST_24032015121022.csv
DEV_TEST_04052015074942.csv
DEV_TEST_05052015115948.csv
DEV_TEST_12052015074942.csv

答案 1 :(得分:2)

很容易重新排列日期,以便可以对词汇进行排序。

按日期时间排序:

my @sorted =
   map /\0(.*)/s,
   sort
   map {
      my ($d,$m,$y,$t) = /(\d{2})(\d{2})(\d{4})(\d{6})/;
      "$y$m$d$t\0$_"
   }
   @unsorted;

按照日期时间之前的任何内容排序,然后按日期时间排序:

my @sorted =
   map /\0(.*)/s,
   sort
   map {
      ( my $fixed = $_ ) =~ s/(\d{2})(\d{2})(\d{4})(?=\d{6})/$3$2$1/;
      $fixed . "\0" . $_
   }
   @unsorted;

答案 2 :(得分:0)

如果您的日期是YYYYMMDDHH24MISS格式,那么简单的字母数字排序就足够了。如下文件名中的替换将使它们成为这种格式:

$filename =~ s/(\d{2})(\d{2})(\d{4})(\d{6})/$3$2$1$4/;