電子書籍の厳選無料作品が豊富!

ruby 初心者の50代のサラリーマンです。
若い人にrubyがいいだろうと言われて挑戦していますが、なかなか分かりません。
どなたか、教えてください。

大きなCSVファイルがあって、
1行目は項目名が入っていて不要です。
2行目以降、
各行2列目にレコード名、
各行8列目に欲しいデータが入っています。
データは29行毎に1レコード分になっています。
レコード名は各行で重複しています。つまり、

試験日,サンプルA,***,・・・・・,観測値1,・・・・・・
試験日,サンプルA,***,・・・・・,観測値2,・・・・・・

試験日,サンプルA,***,・・・・・,観測値29,・・・・・・
試験日,サンプルB,***,・・・・・,観測値1,・・・・・・
試験日,サンプルB,***,・・・・・,観測値2,・・・・・・

試験日,サンプルB,***,・・・・・,観測値29,・・・・・・

というデータです。

それを、
サンプルA,観測値1,観測値2,・・・・・,観測値29
サンプルB,観測値1,観測値2,・・・・・,観測値29
サンプルC,観測値1,観測値2,・・・・・,観測値29

と直してcsvファイルに保存し直したいのです。

どなたか、rubyプログラムの書き方を指南して下さい。

A 回答 (2件)

こんにちは


私も業務で似たようなプログラムを書いてデータ処理しています。
Rubyを覚えるとお手軽に処理できて便利ですよ!

こんな感じで如何でしょうか?
data.csvを読み込んで、output.csvに出力します。
CSVクラスは使ったことないので使用していません。

プログラムがどの様な動作をしているかは、ご自身で確認してみて下さいね。

----ここから
data = Hash.new{|h,k| h[k]=[]}

# CSVファイル読み込み
first_line = true
File.foreach('data.csv') do |line|
if first_line # 1行目読み飛ばし
first_line = false
next
else
ary = line.chomp.split(",") # CSVなので区切りは半角のカンマでは?
data[ary[1]].push(ary[7])
end
end

# データ出力
File.open('output.csv',"w") do |fo|
data.each_key do |key|
fo.puts "#{key},#{data[key].join(',')}"
end
end
----ここまで
    • good
    • 0
この回答へのお礼

永らく、回答もせず、放置して申し訳ありません。
ご回答頂いたスクリプトでは動かず、
結局、会社で分かっている若手に指導をしてもらいました。
次のようなスクリプトで動きました。

require "CSV"
reader=CSV.open("data.csv","r")
writer=CSV.open("output.csv","w")
header=reader.take(1)[0]
f=Array.new
p header # 1行目読み飛ばし
i=0
reader.each do |row|
f[0]=row[1]
f[i]=row[7]
i=i+1
if i==29 then
writer <<f
i=0
end
end
writer.close()

お礼日時:2012/11/12 23:58

RubyでCSVの読み書きするサンプルが、ネット上であふれてるのでそちらをまずマネしてみては。



CSVを読み込むサンプルも、CSV出力するサンプルも、それぞれ3行程度ですので、実行してみて理解するほうが手っ取り早いかと。

もう一つの方法としては、何ができないのかを具体的に質問することを考えてみるとか。
他人に分かりやすく質問を伝えてみることで、自己解決できるケースもありますので。

参考URL:http://www.google.co.jp/search?hl=ja&q=ruby+CSV& …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!