先だって教えていただいた、rubyを使っての家計簿データの加工の続きなのですが、
(前回までに作ったところは、https://teratail.com/questions/258035)
テキストファイル(拡張子がrbになっていますが、コードではありません)に、
2013年 0114 ハーベスト 食品 煮干し10kg 5100 JCB 0630 アマゾン 食品 ユウキにんにくスライス1kg 827 JCB 0630 アマゾン 食品 かどやいりごまlkg(@\654)*2 1308 JCB (中略) 2014年 0213 ok 食品 大麦等 7198 現金 0000 東京ガス ガス0318-0416 1546 JCB 0228 ブックオフ幡ヶ谷 書籍 2895 JCB
のように記録されています。
最初は、各年度のデータごとに別ファイルにコピーして加工しようと考えていたのですが、やってみるとそれも結構面倒なので、年度自体ファイルから読み取って加工できるようにしたいと考えるようになりました。
それで、
ruby
1open("kakeibo_new1.txt", "w") do |f| 2 IO.foreach("kakeibo_ex.rb") do |line| 3 if (/^(\d{4})年/=~line) then year=$1 4 else 5 line.gsub!(/^(\d{4})\t/){year+$1+"\t"} 6 f.puts line 7 end 8 end 9 end 10
というように、コードを変えてみました。
2013年
というような行があった場合、その数字をyearに格納し、それ以外の行の返還に使おうとしたのですが、
test10.rb:5:in `block (3 levels) in <main>': undefined method `+' for nil:NilClass (NoMethodError) from test10.rb:5:in `gsub!' from test10.rb:5:in `block (2 levels) in <main>' from test10.rb:2:in `foreach' from test10.rb:2:in `block in <main>' from test10.rb:1:in `open' from test10.rb:1:in `<main>'
というえらーになります。
おそらく、yearに何も代入されていないのでnilになっているのではないかと思いますが、今回使ったデータファイルの場合、最初の行に
2013年
とあるので、ここで代入が行われるはずなのですが、どうしてnilになっているのかわかりません。
追記
maisumakunさんとotnさんに教えていただいたことをもとにコードを次のように修正し、動くようになりました。
ruby
1open("kakeibo_new1.txt", "w") do |f| 2 year="" 3 IO.foreach("kakeibo_ex.rb") do |line| 4 if (/^(\d{4})年/=~line) then year=$1 5 else 6 line.gsub!(/^(\d{4})\t/){year+$1+"\t"} 7 f.puts line 8 end 9 end 10 end 11 12ここに言語を入力 13``` 14コード 15```
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/10 11:56