arrays - 需要帮助根据文件名中的时间戳对文件列表进行排序

标签 arrays perl sorting hash

未排序的数据

5CM00225_10_16_2017_10_54_42.xml
5CM10538_10_16_2017_11_04_18.xml
1ZM06004_10_16_2017_11_04_14.xml
5XM10010_10_17_2017_08_00_47.xml
5ZM05391_10_15_2017_08_51_07.xml
5ZM05388_10_17_2017_08_01_06.xml
5ZM00058_10_17_2017_08_00_49.xml
NMC00166_10_15_2017_08_51_06.xml
5CM10538_10_15_2017_08_51_06.xml

预期结果

NMC00166_10_15_2017_08_51_06.xml
5CM10538_10_15_2017_08_51_06.xml
5ZM05391_10_15_2017_08_51_07.xml
5CM00225_10_16_2017_10_54_42.xml
1ZM06004_10_16_2017_11_04_14.xml
5CM10538_10_16_2017_11_04_18.xml
5XM10010_10_17_2017_08_00_47.xml
5ZM00058_10_17_2017_08_00_49.xml
5ZM05388_10_17_2017_08_01_06.xml

我使用 Net::SFTP 获取远程站点的目录列表,并与本地文件列表进行比较。我想按文件名中的日期对列表进行排序,但由于字符串中还有我需要忽略的其他信息,我遇到了问题。

my $sftp = Net::SFTP->new( $host,  %args);

my @list = $sftp->ls($path);

open(my $fh, '>', $file); # open a log file to save remote directory listing

    my @sorted = map  { $_->[0] }
         sort { $a->[1] <=> $b->[1] }
         map  { [$_, $_=~/(\d{2})_(\d{2})_(\d{4})_(\d{2})_(\d{2})_(\d{2})/] } # unsuccessful sorting attempt
         @list;

    foreach my $item (@sorted) {
        $i = ${item}->{filename};                               
        print $fh "$1\n"; # prints each record to the open log file
    }
close $fh;

我之前已经做过排序和大量正则表达式,但从来没有同时进行过,而且我显然把它搞砸了,因为它没有对任何东西进行排序,也没有抛出任何错误。

我想过从每个字符串中提取 DD_MM_YYYY_hh_mm_ss 并尝试将其用作引用,但我没有取得任何可用的进展,所以我放弃了这个想法。

最佳答案

这会产生您想要的输出。它将下划线或句点上的每一行拆分为一个列表,然后仅按照您想要的顺序保留您想要的“列”。它保留年份,后跟月份、日期等。然后它将列表元素连接到一个新的日期字符串中,然后根据日期对行进行排序。

use warnings;
use strict;

my @list;
while (<DATA>) {
    chomp;
    push @list, $_;
}

my @sorted = map  { $_->[0] }
    sort { $a->[1] <=> $b->[1] }
    map  { [$_, join '', (split /[_.]/)[3,1,2,4,5,6] ] }
@list;

__DATA__
5CM00225_10_16_2017_10_54_42.xml
5CM10538_10_16_2017_11_04_18.xml
1ZM06004_10_16_2017_11_04_14.xml
5XM10010_10_17_2017_08_00_47.xml
5ZM05391_10_15_2017_08_51_07.xml
5ZM05388_10_17_2017_08_01_06.xml
5ZM00058_10_17_2017_08_00_49.xml
NMC00166_10_15_2017_08_51_06.xml
5CM10538_10_15_2017_08_51_06.xml

我相信您的代码失败了,因为它按照列表中出现的顺序(即月、日等)返回列表。

关于arrays - 需要帮助根据文件名中的时间戳对文件列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46796376/

相关文章:

perl - 如何安装气体预处理器?

mysql - 按重要性和 id 对 mysql 进行排序

python - 根据多列中的值从数据框中删除重复行

python - 按元素出现频率对 python 列表进行排序

arrays - 使用带有内联输出的 jq 1.3 计算 JSON 数组的分组成员

javascript - 如何将数组元素附加到div?

php - 自动添加指向关键字字符串的链接

python - 从 Perl 调用 Node.js(或 python)

java - 获取String值的ArrayList的值

c - perl 中是否有与 read() 相反的函数,就像 C 中的 fwrite() 一样?