perl – 从字符串中提取格式不一致的日期(日期解析,NLP)
发布时间:2020-12-15 23:36:57 所属栏目:大数据 来源:网络整理
导读:我有一个很大的文件列表,其中一些文件嵌入了文件名.日期的格式不一致,往往不完整,例如“Aug06”,“Aug2006”,“2006年8月”,“08-06”,“01-08-06”,“2006”,“011004”等.除此之外,一些文件名有无关的数字看起来有点像日期,例如“20202010”. 简而言之,日
我有一个很大的文件列表,其中一些文件嵌入了文件名.日期的格式不一致,往往不完整,例如“Aug06”,“Aug2006”,“2006年8月”,“08-06”,“01-08-06”,“2006”,“011004”等.除此之外,一些文件名有无关的数字看起来有点像日期,例如“20202010”.
简而言之,日期通常是不完整的,有时不存在,格式不一致,并且嵌入在具有其他信息的字符串中,例如,“报告Aug06.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; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |