gpt4 book ai didi

regex - "smart"(宽容)日期解析器?

转载 作者:行者123 更新时间:2023-12-04 17:14:05 25 4
gpt4 key购买 nike

我必须将一个非常大的数据集从一个系统迁移到另一个系统。其中一个“源”列包含一个日期,但实际上是一个没有约束的字符串,而目标系统要求使用 yyyy-mm-dd 格式的日期。

许多(但不是全部)源日期格式为 yyyymmdd。所以为了将它们强制为预期的格式,我这样做(在 Perl 中):

return "$1-$2-$3" if ($val =~ /(\d{4})[-\/]*(\d{2})[-\/]*(\d{2})/);

当源日期远离“通用”yyyymmdd 时,就会出现问题。目标是在放弃之前挽救尽可能多的日期。示例源字符串包括:

21/3/1998,
2004 年 3 月,
2001年,
97 年 3 月 4 日

我可以尝试将我能找到的尽可能多的示例与一系列正则表达式相匹配,例如上面的那个。

但还有更聪明的做法吗?我不是在重新发明轮子吗?某处有图书馆做类似的事情吗?我找不到任何相关的谷歌搜索“原谅日期解析器”。 (任何语言都可以)。

最佳答案

Date::Manip是您的 friend ,因为它仅在四分之一的情况下失败,因为它采用美国格式,使用 Date_Init 您可以获得 4 个中的 4 个。

如果您有不同的格式(即,一个月前一天,反之亦然),您必须以不同方式解析它们,一次使用美国日期格式,下一次使用非美国日期格式。这在模棱两可时尤其重要,例如 3/4/97 示例,因为如果它是 21/3,它就会失败并且您可以判断格式是错误的。

vinko@mithril:~$ more date.pl
use strict;
use warnings;
use Date::Manip;

my @a;
push @a, "March 2004";
push @a, "2001";
push @a, "3/4/97";
push @a, "21/3/1998";
Date_Init("DateFormat=non-US");
for my $d (@a) {
print "$d\n";
print ParseDate($d)."\n";
};
vinko@mithril:~$ perl date.pl
March 2004
2004030100:00:00
2001
2001010100:00:00
3/4/97
1997040300:00:00
21/3/1998
1998032100:00:00

关于regex - "smart"(宽容)日期解析器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1103079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com