我在写一个perl脚本来解析标准输入中的制表符分隔数据。使用正则表达式/ Perl解析日期列
该脚本删除前导空白和尾随空白,空白字符串为“NULL”的任何字段,并将日期列从“MMM DD YYYY HH:MM:SS:SSSAM”格式重新格式化为“YYYYMMDD”格式。
样品输入:
93092 Apr 1 2010 12:00:00:000AM 59668370.60702875
22341 Apr 1 2010 12:00:00:000AM 51309196.84639429
27844 Apr 1 2010 12:00:00:000AM NULL
150465 Apr 22 2010 12:00:00:000AM 19706190.97586569
119364 Jul 20 2010 12:00:00:000AM 16335977.41009162
目标产出:
93092|20100401|59668370.60702875
22341|20100401|51309196.84639429
27844|20100401|
150465|20100422|19706190.97586569
119364|20100720|16335977.41009162
脚本接受表示它们具有需要转换的日期的列(多个)参数。在上面的示例中,我将以“1”作为参数调用,因为第二列是需要转换的日期。多列将由逗号分隔列表表示。
这是我迄今为止能够做到的。
#!/usr/bin/perl
my @date_cols = split(/,/, $ARGV[0]);
while (<STDIN>) {
my @fields = split(/\t/, $_, -1);
for (@fields) {
s/^\s+//;
s/\s+\z//;
s/^NULL\z//;
}
for (@fields[@date_cols]) {
##NEED HELP WITH DATE FORMATTING
}
print(join('|', @fields), "\n");
}
是您的文件制表符分隔的吗?否则,你的第二列(空白)只是一个月,而不是整个日期。 – chepner 2012-08-07 15:35:34
我建议使用像[DateTime :: Format :: Strptime](https://metacpan.org/module/DateTime::Format::Strptime)这样的模块来处理这个细节。格式化来自[DateTime](https://metacpan.org/module/DateTime)对象的日期在这一点上变得微不足道。 – zostay 2012-08-07 15:39:26
或者也许Time :: Piece - 这是在Perl核心发行版中。 – 2012-08-07 15:52:15