Projeto: Vermelho

logs of development
<< Rails: localizing(into Japanese) | main | csvファイルを読み込み並べ替えるプログラム(userを入れる) >>
スポンサーサイト

一定期間更新がないため広告を表示しています

| - | | - | -
csvファイルを読み込み並べ替えるプログラム
Rubyのハッシュテーブルのバグに悩まされながらも、やっと完成。埋まれて初めての動いてしかも利用価値のあるプログラムです。

☆ ☆ ☆

こんな電話料金csvファイル(年月,電話番号,料金の順に並んでます)があったとして、それを電話番号別の月別料金に並び替えるプログラム。

200609,090-XXXX-XXXA,7009
200609,080-XXXX-XXXB,5609
200609,090-XXXX-XXXC,6709
200609,090-XXXX-XXXD,2309
200610,090-XXXX-XXXA,7010
200610,080-XXXX-XXXB,5610
200610,090-XXXX-XXXC,6710
200610,090-XXXX-XXXD,2310
200610,080-XXXX-XXXE,4710
200611,080-XXXX-XXXB,5611
200611,090-XXXX-XXXC,6711
200611,090-XXXX-XXXD,2311
200611,080-XXXX-XXXE,4711
200612,090-XXXX-XXXC,6712
200612,090-XXXX-XXXD,2312
200612,080-XXXX-XXXE,4712

☆ ☆ ☆
#これがプログラム本体

hshMonth = Hash.new
hshNumber = Hash.new
arrMonth = Array.new
arrNumber = Array.new

#電話番号と月の内容を配列に取り出す
open("cellcost.csv", "r") do |f|
i = 0
# puts "¥n" + "電話番号と月との組み合わせをすべて表示する"
while line = f.gets
if /(¥d+),(¥S+),(¥d+)/ =~ line
arrMonth[i] = $1.to_i
arrNumber[i] = $2.to_s
print arrNumber[i], "と", arrMonth[i], "¥n"
end
i += 1
end
end

#電話回線と月の重複を削除する(降順に破壊的sort)
arrMonthUniq = arrMonth.uniq
arrMonthUniq.sort!
arrNumberUniq = arrNumber.uniq
arrNumberUniq.sort!

#電話回線と月とのそれぞれの最大数を取り出す
arrNumberSize = arrNumberUniq.size
arrMonthSize = arrMonthUniq.size

#重複整理後:hashのバグ回避のため、電話番号と月とをkeyとする月ハッシュを生成し、それをvalueとする電話番号ハッシュの生成する
puts "¥nハッシュテーブルを表示"
arrNumberUniq.each do |d|
hshMonth = Hash.new
arrMonthUniq.each do |q|
month = d.to_s + "_" + q.to_s
hshMonth[month] = 0
end
hshNumber[d] = hshMonth
end
p hshNumber

#必要数を表示する
puts " "
puts '何ヶ月の表示をしますか?:'
puts arrMonthSize.to_s + 'ヶ月です'
puts '最大で何回線ありますか?:'
puts arrNumberSize.to_s + '回線です'

#電話番号ハッシュのvalueにコストを挿入する
puts "¥nコストを組込みます"
open("cellcost.csv", "r") do |list|
while line = list.gets
line.chomp!
if /(¥d+),(¥S+),(¥d+)/ =~ line
printf("%3d %s¥n", list.lineno,line)
monthOrigin = $2.to_s + "_" + $1.to_s
number = $2.to_s
cost = $3.to_i
costNow = hshNumber[number][monthOrigin]
if costNow != 0
next
else
printf("$2は%s,$1は%d¥n", number, $1)
hshNumber[number][monthOrigin] = cost
end
end
end
end

puts "¥n" + "ハッシュのkeyとvalueをすべて表示する"
p hshNumber

puts "¥nファイルに出力します"
open("cellcostfinal.csv", "w") do |final|
final.print "#"
arrMonthUniq.each do |p|
final.print ",", p.to_s
end
final.print ",前年対比¥n"
arrNumberUniq.each do |num|
arrCost = Array.new
arrCost[0] = num
arrMonthUniq.each do |q|
month = num.to_s + "_" + q.to_s
costFinal = hshNumber[num][month]
arrCost.push(costFinal)
end
taihi = arrCost[-1] - arrCost[-2] #前年対比
arrCost.push(taihi) #前年対比を配列の最後に追加
arrCost.each do |costTrue|
if costTrue != nil
final.print costTrue, ","
end
end
final.print "¥n"
end
end

#☆ ☆ ☆

#実行すると・・・こうなります。「電話番号,1ヶ月めの料金、2ヶ月めの料金,3ヶ月めの料金,4ヶ月めの料金」の順にならび変わりました。

##,200609,200610,200611,200612
#090-XXXX-XXXA,7009,7010,0,0,
#080-XXXX-XXXB,5609,5610,5611,0,
#090-XXXX-XXXC,6709,6710,6711,6712,
#090-XXXX-XXXD,2309,2310,2311,2312,
#080-XXXX-XXXE,0,4710,4711,4712,
| Pg_Ruby_Coding | 11:57 | comments(0) | -
スポンサーサイト
| - | 11:57 | - | -
コメント
コメントする