从ruby中的字符串中计算日期格式

时间:2014-07-26 15:43:24

标签: ruby oracle datetime-format

我正在使用一个简单的数据加载器来处理文本文件,并希望添加一个功能来正确地将日期加载到表中。我遇到的问题是我之前不知道日期格式,并且它不会是我的脚本执行插入 - 它必须生成插入语句供以后使用。

Date.parse几乎是我所需要的。如果有一种方法可以获取它在字符串上标识的格式,我可以用来生成to_date(...)(Oracle标准)的方式是完美的。

一个例子:

我的输入文件:

user_name;birth_date
Sue;20130427
Amy;31/4/1984

应该生成:

insert into my_table values ('Sue', to_date('20130427','yyyymmdd'));
insert into my_table values ('Amy', to_date('31/4/1984','dd/mm/yyyy'));

请注意,原始字符串保持不变非常重要 - 因此我无法将其解析为插入中使用的标准格式(这是一项要求)。

目前我正在测试一堆正则表达式并进行一些验证,但我想知道是否有更强大的方法。

2 个答案:

答案 0 :(得分:3)

假设(使用例如String#scan),您从单个文件中提取了日期字符串数组。它可能像:

strings = ["20130427", "20130102", ...]

提前准备一系列您能想到的所有格式。它可能像:

Formats = ["%Y%m%d", "%y%m%d", "%y/%m/%d", "%m/%d/%y", "%d/%m/%y", ...]

然后检查所有可以解析所有字符串的格式:

require "date"
formats =
Formats.select{|format| strings.all?{|s| Date.strptime(s, format) rescue nil}}

如果此数组formats只包含一个元素,那么这意味着字符串被明确地用该格式解析。使用该格式,您可以返回字符串并使用该格式解析它们。

否则,您未能在Formats内提供适当的格式,或者字符串仍然不明确。

答案 1 :(得分:0)

我会使用Chronic宝石。它将以大多数格式提取日期。

它有解决xx / xx / xxxx格式歧义的选项,但是你必须在匹配时指定哪个更喜欢。