0

私はルビーにかなり慣れていません。私は次のcsvを持っています:

Office (1), Test 
Office (Test)(2), Test

「data.csv」で。

それから私のルビースクリプトで私は持っています;

CSV.foreach("data.csv") do |line|
  registeredOffice = line[0].to_s() 
  macOffice = registeredOffice.scan(/\(([^\)]+)\)/).last


  csvText = "#{csvText}\n#{macOffice}"
end

それは私に与えます

["1"]
["2"]

ただし、上記を文字列に変換する方法を知りたいので、出力は

1
2

を使用.joinまたは[0]返すnil:NilClass (NoMethodError)

4

2 に答える 2

0

次の行:

macOffice = registeredOffice.scan(/\(([^\)]+)\)/).last

scan は配列の配列を返すため、配列を返します。の 1 行目はdata.csv、 です["1"]

にはスカラー値が必要だと思います。したがって、一致の配列を一度返すmacOfficeを使用して、非反復一致のみを返す match を使用したいと思います。matchたとえば、[1]添字を使用して、返された配列から最初の一致を取得できます。

macOffice = registeredOffice.match(/\(([^\)]+)\)/)[1]

を返します1

配列が必要だと仮定すると、次のように記述できます。

out = []
CSV.foreach("data.csv") do |line|
  registeredOffice = line[0].to_s() 
  macOffice = registeredOffice.match(/\((\d+)\)/)[1]
  out.push(macOffice)
end

puts out.join(",")

生産する1,2

于 2012-06-13T09:48:07.460 に答える
0

おそらく次のようなものが必要です。

macOffice = registeredOffice[/(\d+)\)$/, 1]

キャプチャ グループを使用してスキャンすると、多次元配列が得られます

于 2012-06-13T09:06:45.017 に答える