2010-08-10 121 views
6

我有一大堆文件,其中一些文件的日期已嵌入。日期的格式不一致且通常不完整,例如“Aug06”,“Aug2006”,“August 2006”,“08-06”,“01-08-06”,“2006”,“011004”等。除此之外,一些文件名具有不相关的数字,日期,例如“20202010”。从字符串中提取格式不一致的日期(日期解析,NLP)

简言之,日期通常是不完整的,有时不存在,格式不一致,并且与其他信息一起嵌入到字符串中。 “Aug06.xls报告”。

是否有任何Perl模块可用,它会做这样一个字符串猜测日期的体面工作?它不一定是100%正确的,因为它会通过人工验证,但我正在尽可能为那个人制作简单的东西,并且有成千上万的条目需要检查:)

回答

3

Date :: Parse绝对会成为你的答案的一部分 - 这是一个随机格式化的类似日期的字符串,并将实际可用日期排除在外。

问题的其他部分 - 文件名中其余的字符 - 非常不寻常,以至于您不太可能找到其他人为您打包了一个模块。

没有看到更多您的样本数据,它只能猜测,但我首先确定可能的或可能的“日期部分”候选人。

这是一个令人讨厌的蛮力示例,使用Date :: Parse(一个更智能的方法将使用正则表达式列表来尝试和识别日期位 - 我很高兴地刻录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; 
    } 
    } 
+0

这有点类似于我到底是怎么做的,但我的时间更长,更丑陋,更可怕:)我现在不会提出这个问题,以防有人在那之前遇到问题,但似乎像一个滚动你自己的解决方案的东西...... – 2010-08-10 06:24:46

+0

你的答案基本上是正确的;似乎没有任何图书馆这样做,你必须自己做:) – 2010-08-13 15:18:53

0

Date::Parse做你想做的。

+0

Date :: Parse不能很好地处理字符串中的所有其他垃圾,所以我有100%未定义的速率使用它;我需要一些足够聪明的东西来忽略残缺并找到一个日期。我想,它和日期解析一样是自然语言处理。 – 2010-08-10 01:33:22

0

DateTime::Format::Natural看起来像这个工作的候选人。我个人不能担保,但它有good reviews

+0

我确实碰到过它,但像Date :: Parse,Date :: Manip等人似乎要求所有的数据在该字符串与日期相关,而我的字符串的大部分内容只是噪声(文件名的其他部分)。 – 2010-08-10 06:25:48