我当前的代码旨在通过一个巨大的.csv文件,并将某些日期重新格式化为SQL Datetime友好格式。它们目前是DDMMYYYY,我希望它们是YYYYMMDD,这就是我采用的方法(取决于不同的SO问题):
CSV.foreach('file.csv') do |x|
if x[0] == "1"
x.gsub(/([0-9]{2})-+([0-9]{2})-+([0-9]{4})/,/\3-\2-\1/)
else
end
这会引发错误“无效的反馈编号/名称”。
文档告诉我,我可以通过使用?<name>
定义组并使用\k<name>
反向引用它来避免这种情况,但我尝试这样做的所有尝试都以失败告终。有人可以告诉我它应该如何看待,或者提供替代解决方案吗?
答案 0 :(得分:5)
没有正则表达式:
str = "DDMMYYYY"
p new_str = str[4..7] << str[2..3] << str[0..1]
#=> "YYYYMMDD"
答案 1 :(得分:4)
gsub的第二个参数应该是字符串,而不是正则表达式(参见docs)。
执行:
x.gsub(/([0-9]{2})-+([0-9]{2})-+([0-9]{4})/,'\3-\2-\1')
请注意,第二个参数使用'replacement string'
而不是/replacement string/
。
答案 2 :(得分:2)
我认为值得补充的是,虽然上述答案是正确的,但他们并没有解决OP所遇到的错误。第二个参数是正则表达式时,此错误不是问题。实际上在上面的例子中,ruby实际上从不调用gsub方法,因为第二个参数中的正则表达式不会被解析。反斜杠后跟任何数字都会导致此错误。它是一个无效的正则表达式。
答案 3 :(得分:0)
使用'
分隔您的第二个gsub
参数(替换字符串),而不是/
答案 4 :(得分:0)
我会选择Date::strptime
和Date#strftime
:
dates = %w[12122012 10121012 12032013]
#=> ["12122012", "10121012", "12032013"]
dates.each do |date_str|
date = Date.strptime(date_str, '%d%m%Y')
puts date.strftime('%Y %m %d')
end
# 2012 12 12
# 1012 12 10
# 2013 03 12