rubyで、家計簿を加工するコードを書きたいです。
もともと家計簿の支出部分を、
1002 サンディ 食品 生鮮食品 1274 現金
1018 サンディ 食品 生鮮食品 2967 現金
1108 サンディ 食品 生鮮食品 2895 現金
というように、
月日 購入先 大分類 小分類 金額 決済手段
というように、タブ区切りの六つの項目で記録していました。
これを、
- 月日の前に西暦年をつける
2.並び順を
年月日 金額 決済手段 購入場所 大分類 小分類
に並べ替える。
という加工をしたいです。
ruby
1# 行頭に半角数字4つが並んでいれば、その前に西暦年を追加 2open("kakeibo_new1.txt", "w") do |f| 3 IO.foreach("kakeibo_ex.rb") do |line| 4 line.gsub!(/^(\d{4})/){'2016'+$1 } 5 f.puts line 6 end 7 end 8# 各行をタブで分割し、二重配列にする 9a=[] 10open("kakeibo_new2.txt", "w") do |f| 11 IO.foreach("kakeibo_new1.txt") do |line| 12 b=line.split(/\t/) 13 a.push(b) 14 end 15 end 16# 以下のswapメソッドはHayato OKUMOTO @falcon8823さん作成のもの 17class Array 18 def swap!(a,b) 19 raise ArgumentError unless a.between?(0, self.count-1) && b.between?(0, self.count-1) 20 self[a],self[b]=self[b],self[a] 21 self 22 end 23 def swap(a,b) 24 self.dup.swap!(a,b) 25 end 26end 27 28a.each do |b| 29 swap!(b[1],b[4]) 30end
まず、1はできました。
2については、まずいったんデータ全体を入れ子配列にし、子配列の要素を入れ替えるという形で列の入れ替えをしようと思いました。
そこで、配列の要素の入れ替えについては、ネット上で公開されていた、Arrayクラスにメソッドを追加するという形でやろうとしたのですが、
そのメソッドを使っての実行段階で、「メソッドが定義されていない」というエラーが出ます。
swapメソッドはネットで公開されていたものを丸写ししています。
追記
教えていただいたことを参考に、完成させたのが以下のコードです。
ruby
1# 行頭に半角数字4つが並んでいれば、その前に西暦年を追加 2open("kakeibo_new1.txt", "w") do |f| 3 IO.foreach("kakeibo_ex.rb") do |line| 4 line.gsub!(/^(\d{4})/){'2016'+$1 } 5 f.puts line 6 end 7 end 8# 各行をタブで分割し、二重配列にする 9a=[] 10open("kakeibo_new2.txt", "w") do |f| 11 IO.foreach("kakeibo_new1.txt") do |line| 12 line.chomp! 13 b=line.split(/\t/) 14 a.push(b) 15 end 16 end 17# 以下のswapメソッドはHayato OKUMOTO @falcon8823さん作成のもの 18class Array 19 def swap!(a,b) 20 raise ArgumentError unless a.between?(0, self.count-1) && b.between?(0, self.count-1) 21 self[a],self[b]=self[b],self[a] 22 self 23 end 24 def swap(a,b) 25 self.dup.swap!(a,b) 26 end 27end 28p a 29 30a.each do |b| 31 b.swap!(1,4) 32 b.swap!(2,5) 33 b.swap!(3,4) 34 b.swap!(4,5) 35end 36 37open("kakeibo_new3.txt", "w") do |f| 38 a.each do |b| 39 f.puts b.join("\t") 40 end 41end
katoyさんのようにやったほうが明らかに効率出来ですが、最初に作りかけたものも完成させたかったので。
その際に、12行目に
line.chomp!
も入れました。
unexpected /n
というエラーメッセージが出て、何が原因かなかなかわからなかったのですが、ここの改行を取ったらちゃんと動くようになりました。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/02 11:59