1

私の現在のコードは、巨大な .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>が、そうしようとする私の試みはすべて失敗に終わりました。誰かがそれがどのように見えるべきかを教えてくれますか、または別の解決策を提供してくれますか?

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 の 2 番目のパラメーターは、正規表現ではなく文字列にする必要があります (ドキュメントを参照)。

行う:

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

2 番目のパラメーターは'replacement string'代わりに を使用することに注意してください/replacement string/

于 2013-03-11T19:37:36.923 に答える
3

上記の回答は正しいですが、OPが取得していたエラーに対処していないことを追加する価値があると思います。このエラーは、2 番目のパラメーターが正規表現である場合の問題ではありません。実際、上記の場合、2 番目のパラメーターの正規表現が解析されないため、ruby が実際に gsub メソッドを呼び出すことはありません。バックスラッシュの後に任意の数字が続くと、このエラーが発生します。無効な正規表現です。

于 2015-07-20T23:32:56.043 に答える
0

代わりに、2 番目のパラメーター (置換文字列)'を区切るために使用します。gsub/

于 2013-03-11T19:42:00.187 に答える
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
于 2013-03-12T08:00:19.130 に答える