【问题标题】:Perl sort with time stamp using hashPerl 使用哈希进行时间戳排序
【发布时间】:2015-08-05 14:02:15
【问题描述】:

我是 Perl 新手,需要帮助使用散列和/或任何其他可能的方法进行排序,这可以在 Perl 中完成。

我有一个如下所示的输入文件,并希望生成如图所示的输出文件。

我在想是否可以通过将其放入哈希然后比较来完成?如有可能,请为学习目的提供步骤说明。

如果文件具有与不同时间戳匹配的重复/三次条目,则应仅列出最新的时间戳条目。

输入文件

A 5月19日 23:59:14 B 5 月 19 日 21:59:14 A 5 月 22 日 07:59:14 C 4 月 10 日 12:23:00 B 5 月 11 日 10:23:34

输出应该是

A 5 月 22 日 07:59:14 B 5 月 19 日 21:59:14 C 4 月 10 日 12:23:00

【问题讨论】:

  • 你有没有尝试过?
  • 我尝试了 sort 命令,但想看看 Perl 散列是否可以做到这一点,因为我有数千个这样的条目,需要一些可以更快完成的东西。排序命令没有。
  • 哈希不会帮助您对数据进行排序。请显示您尝试过的代码

标签: perl hashtable


【解决方案1】:

您可以尝试在 perl 哈希中使用您的数据(A、B 等)作为键和时间戳作为值。 然后读取输入文件并使用 perl 时间数据类型比较时间戳。这样你只保留最新的条目,其他的可以被丢弃。最后打印结果。

【讨论】:

  • #! /usr/bin/perl %dls;打开(日志,“/tmp/input_file”); while ( $line = ) { #print $line; $dl = substr $line, 0,1; $timestamp = substr $line, 2; if ( $timestamp > $dls{dl} ) { $dls{dl} = $timestamp; } } foreach $dlname (排序键 %dls) { print TMP "$dlname,$dls{$dlname}\n"; } ~
  • 对不起,我在每行添加了两个空格,但仍然显示混乱..如果您对如何格式化有建议,请告诉他们
  • 抱歉迟到了评论。我看到了您的代码,最后看到了您正在打印结果的TMP
【解决方案2】:

散列适用于合并重复项。 然而,按时间戳排序需要将“文本”表示转换为实际时间。 Time::Piece 是这样做的更好选择之一

#!/usr/local/bin/perl
use strict;
use warnings;

use Time::Piece;
my %things;
while (<DATA>) {
    my ( $letter, $M, $D, $T ) = split;
    my $timestamp =
        Time::Piece->strptime( "$M $D $T 2015", "%b %d %H:%M:%S %Y" );
    if ( not defined $things{$letter}
        or $things{$letter} < $timestamp )
    {
        $things{$letter} = $timestamp;
    }

}

foreach my $thing ( sort keys %things ) {
    print "$thing => ", $things{$thing}, "\n";
}

__DATA__
A May 19 23:59:14
B May 19 21:59:14
A May 22 07:59:14
C Apr 10 12:23:00
B May 11 10:23:34

请注意 - 您的时间戳不明确,因为它们省略了年份。你必须以某种方式处理这个问题。我选择了只插入 2015 年的简单道路。这不是一个好习惯——至少你应该使用某种方式自动发现“当前年份”——但请记住,在一年中的某些时候,这将只是休息。

您可以使用Time::Piece 中的strftime 方法格式化输出日期 - 这只是默认输出。

【讨论】:

  • 优秀。感谢您指导我并快速解决 Sobrique。再次感谢您的帮助。
猜你喜欢
  • 2015-03-12
  • 1970-01-01
  • 1970-01-01
  • 2012-01-21
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 2011-06-08
相关资源
最近更新 更多