使用Perl从日期提取月和日

时间:2013-10-09 19:38:44

标签: perl date

我有一个列出日期的数据文件。日期的格式为m / d / yyyy。示例如下所示:

1/1/2011
1/10/2011
10/1/2011
10/10/2011

我的问题是,如何提取月份和日期,以便将其存储在两个单独列中的不同文件中?例如,我想显示为

Month  Day
1       1
1       10
10      1
10      10

5 个答案:

答案 0 :(得分:1)

my ($Day, $Month, $Year) = split(m{/}, $Line);

答案 1 :(得分:0)

假设您的所有日期都遵循相同的格式,那么您甚至不需要正则表达式。解决方案的一般形式如下:

my ($month, $day, $year) = split(m@/@, $date);

如果您正在阅读文件dates.txt,则可以使用它:

open my $DATES, '<', 'dates.txt'
  or die "Couldn't open dates.txt: $!\n";

while (my $date = <$DATES>) {
  $date =~ s@\r|\n@@g; # get rid of trailing newlines, however formatted
  my ($month, $day, $year) = split(m@/@, $date);
  # whatever you need to do with the date parts, do here
};

close DATES;

请注意,根据您所在教育机构的学术荣誉政策,当您上交作业时,您可能需要引用此Stack Overflow答案作为参考,其中包括各种处罚的痛苦,并可能包括驱逐。

答案 2 :(得分:0)

使用perl

perl -pe 's#(\d+)/(\d+)/\d+#$1\t$2#' file > new_file

使用sed

sed -r 's#([0-9]+)/([0-9]+)/[0-9]+#\1\t\2#' file > new_file

答案 3 :(得分:0)

我相信,使用正则表达式提取字符串中的所有数字字段,而不是使用split是最明显的

my ($m, $d, $y) = $date =~ /\d+/g;

这是一个完整的程序,显示了这个想法。

use strict;
use warnings;

my @dates = qw<
  1/1/2011
  1/10/2011
  10/1/2011
  10/10/2011
>;

print "Month  Day\n";

for (@dates) {
  my ($m, $d, $y) = /\d+/g;
  printf "%-7d %-7d\n", $m, $d;
}

<强>输出

Month  Day
1       1      
1       10     
10      1      
10      10     

答案 4 :(得分:-1)

split与切片一起使用:

#!/usr/bin/perl
use warnings;
use strict;
use feature 'say';

for my $date (qw(1/1/2011
                 1/10/2011
                 10/1/2011
                 10/10/2011)) {
    say join "\t", (split m{/}, $date)[0, 1];
}