1

我当前的代码旨在通过一个巨大的 .csv 文件并将某些日期重新格式化为 SQL 日期时间友好格式。它们目前是 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>,但是我所有这样做的尝试都以失败告终。有人可以告诉我它的外观,或提供替代解决方案吗?

4

5 回答 5

5

没有正则表达式:

str = "DDMMYYYY"
p new_str = str[4..7] << str[2..3] << str[0..1]
#=> "YYYYMMDD"
于 2013-03-11T19:44:23.670 回答
4

gsub 的第二个参数应该是字符串,而不是正则表达式(请参阅文档)。

做:

x.gsub(/([0-9]{2})-+([0-9]{2})-+([0-9]{4})/,'\3-\2-\1')

请注意,第二个参数使用'replacement string'而不是/replacement string/.

于 2013-03-11T19:37:36.923 回答
3

我认为值得补充的是,虽然上述答案是正确的,但它们并没有解决 OP 遇到的错误。此错误不是第二个参数是正则表达式的问题。事实上,在上述情况下,ruby 从未真正调用 gsub 方法,因为第二个参数中的正则表达式不会解析。后跟任何数字的反斜杠将导致此错误。这是一个无效的正则表达式。

于 2015-07-20T23:32:56.043 回答
0

用于'分隔您的第二个gsub参数(替换字符串),而不是/

于 2013-03-11T19:42:00.187 回答
0

我会选择Date::strptimeDate#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
于 2013-03-12T08:00:19.130 回答