質問: ### 前提・実現したいこと Rubyを使って、書籍管理のシステムを作っています。 ### 発生している問題・エラーメッセージ 本の発注があった場合に、下記の在庫リストのcsvファイルにアクセスして、volumeと書かれている数字のカウントを減らしてcsvファイルを保存したいのですが上手くいきません。 csvファイルの行列を指定して書き込むを行う方法はありますか? 例 0行目(A)のvolume列(1)を-1する。 name volume A 1 B 2 C 1 D 1 E 1 F 1 ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/29a45dd044d34999e1dbfe3a39657ecf.jpeg) ### 該当のソースコード ``` ここにご自身が実行したソースコードを書いてください ``` ### 試したこと fileクラスの追記モードだと末尾にデータが出力されるだけでうまくいきませんでした。 csv.tableを使ってcsvの読み込みをしています。 ### 補足情報(言語/FW/ツール等のバージョンなど) Rubyは最新バージョンです。
回答: ファイルの更新の仕方がわからないということでしょうか? 案1.別ファイル名で書きだして、クローズしてから、元ファイルを削除して、リネームする。 案2.読み込みオープンした物をクローズしてから、同じファイルを書き込みオープンして上書きする。デメリットとして書き込み中にプログラムが落ちるとデータが失われる。 コメントを見ての追記 ========== サンプル:数字の書かれたファイルを読んで、数字を+1してファイルを更新する ``` #案1 FILENAME="foo" FILENAME_NEW=FILENAME+".new" n = IO.read(FILENAME).to_i n += 1 open(FILENAME_NEW,"w") do |f| f.write(n) end File.delete(FILENAME) File.rename(FILENAME_NEW, FILENAME) #案2 FILENAME="foo" n = IO.read(FILENAME).to_i n += 1 open(FILENAME,"w") do |f| f.write(n) end ``` さらにコメント見て追記 =========== ``` wk = @rest[:volume] for a in 0...data do for b in 0...datas do #注文リストと在庫リストのマッチングを行う if @rest[:name][b] == @book[:name][a] wk[b]-=1 end end end @rest[:volume] = wk @rest.to_csv をファイルに書く ``` forの所は、Arrayの各種メソッドを使えばもっとシンプルに出来ますね。 あと、restやbookをインスタンス変数にしている理由が分かりません。