我有一个很大的文件列表,其中一些文件名中嵌入了日期。日期的格式不一致且通常不完整,例如“Aug06”、“Aug2006”、“August 2006”、“08-06”、“01-08-06”、“2006”、“011004”等。除此之外,某些文件名具有不相关的数字,看起来有点像日期,例如“20202010”。
简而言之,日期通常不完整,有时不存在,格式不一致,并且与其他信息一起嵌入到字符串中,例如“8 月报告.xls”。
是否有可用的 Perl 模块可以很好地从这样的字符串猜测日期?它不一定是 100% 正确,因为它将由人工手动验证,但我试图让事情对那个人来说尽可能简单,并且有数千个条目需要检查:)
Date::Parse 肯定会成为您答案的一部分 - 该位计算出随机格式化的类似日期的字符串并从中生成实际可用的日期。
你的问题的另一部分——文件名中的其余字符——很不寻常,你不太可能发现其他人已经为你打包了一个模块。
如果没有看到更多的示例数据,实际上只能猜测,但我首先要确定可能的或可能的“日期部分”候选者。
这是一个使用 Date::Parse 的令人讨厌的暴力示例(更聪明的方法是使用 regex-en 列表来尝试识别日期位 - 我很高兴燃烧 cpu 周期而不是想得那么难!)
!/usr/bin/perl
use strict;
use warnings;
use Date::Parse;
my @files=("Report Aug06.xls", "ReportAug2006", "Report 11th September 2006.xls",
"Annual Report-08-06", "End-of-month Report01-08-06.xls", "Report2006");
# assumption - longest likely date string is something like '11th September 2006' - 19 chars
# shortest is "2006" - 4 chars.
# brute force all strings from 19-4 chars long at the end of the filename (less extension)
# return the longest thing that Date::Parse recognises as a date
foreach my $file (@files){
#chop extension if there is one
$file=~s/\..*//;
for my $len (-19..-4){
my $string = substr($file, $len);
my $time = str2time($string);
print "$string is a date: $time = ",scalar(localtime($time)),"\n" if $time;
last if $time;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)