我正在使用一个简单的数据加载器来处理文本文件,并希望添加一个功能来正确地将日期加载到表中。我遇到的问题是我之前不知道日期格式,并且它不会是我的脚本执行插入 - 它必须生成插入语句供以后使用。
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'));
请注意,原始字符串保持不变非常重要 - 因此我无法将其解析为插入中使用的标准格式(这是一项要求)。
目前我正在测试一堆正则表达式并进行一些验证,但我想知道是否有更强大的方法。
答案 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格式歧义的选项,但是你必须在匹配时指定哪个更喜欢。