前提・実現したいこと
Rubyを使って、書籍管理のシステムを作っています。
発生している問題・エラーメッセージ
本の発注があった場合に、下記の在庫リストのcsvファイルにアクセスして、volumeと書かれている数字のカウントを減らしてcsvファイルを保存したいのですが上手くいきません。
csvファイルの行列を指定して書き込むを行う方法はありますか?
例 0行目(A)のvolume列(1)を-1する。
name volume
A 1
B 2
C 1
D 1
E 1
F 1
該当のソースコード
ここにご自身が実行したソースコードを書いてください
試したこと
fileクラスの追記モードだと末尾にデータが出力されるだけでうまくいきませんでした。
csv.tableを使ってcsvの読み込みをしています。
補足情報(言語/FW/ツール等のバージョンなど)
Rubyは最新バージョンです。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
ファイルの更新の仕方がわからないということでしょうか?
案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をインスタンス変数にしている理由が分かりません。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.13%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/01/04 17:26
説明が不十分で申し訳ございません。
実際のコードの一部が下記のコードになります。
#本の注文リストのデータを読み込む
@book=CSV.table('book.csv',encoding:'Shift_JIS:UTF-8')
#在庫の一覧表を読み込む
@rest=CSV.table('rest.csv',encoding:'Shift_JIS:UTF-8')
#注文リストのデータ数
data=@book[:name].length
#在庫の一覧表のデータ数
datas=@rest[:name].length
#
for a in 0..data-1 do
for b in 0..datas-1 do
#注文リストと在庫リストのマッチングを行う
if /#{@rest[:name][b]}\Z/ =~ @book[:name][a]
ここにマッチしたジグの枚数をrest.csvファイルからマイナス1するという処理を入れたいです。
このマッチしたrest.csvファイルのvolumeの値を書き換えて保存する方法が分かりません。
end
end
end
2017/01/04 17:35
※ジグの枚数→在庫の数です
2017/01/04 18:15
ファイルの更新の仕方がわからないということでしょうか?
質問2
わたしの書いた回答の意味がわからないということでしょうか?それとも意味はわかるがコードに出来ないと言うことでしょうか?
2017/01/04 19:25
ファイルの更新の仕方がわかりません。(行列を指定して、csvの内容を書き換えて更新する方法)
2017/01/04 19:28
わたしの書いた回答の意味がわからないということでしょうか?それとも意味はわかるがコードに出来ないと言うことでしょうか?
2017/01/04 19:40
2017/01/04 22:24
コードを見たのですが、この処理だとrest.csvの一致した行のvolume列の値のみを書き換えることができないと思うのですが、いかかでしょうか?
私の質問文の方で、画像を入れれることが分かったので、処理の流れ図を追加しました、何度も申し訳ございませんが確認していただければ幸いです。
2017/01/04 23:22
2017/01/04 23:35
説明が不十分で申し訳ございません。
2017/01/05 00:46
拙い質問に根気強くお答えいただき本当にありがとうございました!