ruby使用csv日期格式化无效日期(argumenterror)

kh212irz  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(427)

我正在分析一个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
x759pob2

x759pob21#

从文件中:

Date.parse

解析给定的日期和时间表示形式,并创建日期对象。
此方法不起验证程序的作用。如果输入字符串与有效格式不完全匹配,则可能会得到一个隐藏的结果。应考虑使用 Date.strptime 尽可能不使用这种方法。
您当前的实现没有真正意义;它不是在做你认为它是什么:

Date.parse('6/6/99', "%Y-%m-%d")
  #=> Date::Error: invalid date

这不是说“皈依” "6/6/99" 进入 "1999-06-06" ,它的意思是“尝试解析 "6/6/99" 变成 Date 对象(第二个参数基本上被忽略了!)。
如果您确信该日期应该是什么格式,那么(根据上面引用的文档!)你可以用 Date.strptime 尝试将其显式解析为此格式。例如:

Date.strptime('6/6/99', "%m/%d/%y")
  #=> #<Date: 1999-06-06 ((2451336j,0s,0n),+0s,2299161j)>

或者,如果您不确定前两个值应该表示月-日还是日-月,那么您需要在代码中显式地处理这一点,并适当地处理错误。
tl;博士: Date.parse 对任意输入不可靠;它只对日期格式进行“最佳猜测”。在这里,毫不奇怪,它至少在一种你正在使用的模棱两可的格式中失败了。 Date.strptime 是解析每个日期的正确方法,当您知道所需的格式时。

相关问题