我正在分析一个csv文件,我需要更改dob以匹配特定的文件格式 YYY-MM-DD
我总是犯这样的错误 parse': invalid date (ArgumentError)
当它试图解析此日期时会发生这种情况 "6/6/99"
我怎样才能解决这个问题,使我的任何日期都不会出现任何错误?
csv中所有日期的列表,我不确定上述日期之后的任何其他日期是否也会出错。
"12/12/2010"
"1/1/1988"
"2/2/1966"
"6/6/99"
"1/4/88"
"4/4/1948"
"1/6/1988"
"1/7/1988"
"1/8/88"
"1/9/88"
"1988-02-12"
"1-11-88"
"1/12/88"
"1/13/88"
我的代码
require 'csv'
require 'time'
require 'date'
def parse_csv
table = CSV.parse(File.read("input.csv", encoding: 'bom|utf-8' ), headers: true, col_sep: ",")
formatted = table.map(&:to_h)
formatted.each do |x|
if x["dob"] =~ /^\d{4}-\d{2}-\d{2}$/
p "correct"
else
parsed = Date.parse(x["dob"], "%Y-%m-%d")
p parsed
end
end
end
parse_csv
1条答案
按热度按时间x759pob21#
从文件中:
解析给定的日期和时间表示形式,并创建日期对象。
此方法不起验证程序的作用。如果输入字符串与有效格式不完全匹配,则可能会得到一个隐藏的结果。应考虑使用
Date.strptime
尽可能不使用这种方法。您当前的实现没有真正意义;它不是在做你认为它是什么:
这不是说“皈依”
"6/6/99"
进入"1999-06-06"
,它的意思是“尝试解析"6/6/99"
变成Date
对象(第二个参数基本上被忽略了!)。如果您确信该日期应该是什么格式,那么(根据上面引用的文档!)你可以用
Date.strptime
尝试将其显式解析为此格式。例如:或者,如果您不确定前两个值应该表示月-日还是日-月,那么您需要在代码中显式地处理这一点,并适当地处理错误。
tl;博士:
Date.parse
对任意输入不可靠;它只对日期格式进行“最佳猜测”。在这里,毫不奇怪,它至少在一种你正在使用的模棱两可的格式中失败了。Date.strptime
是解析每个日期的正确方法,当您知道所需的格式时。