質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

1993閲覧

Rubyでのcsvファイルの操作について

ebitiri

総合スコア7

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2017/01/04 07:02

編集2017/01/04 13:19

###前提・実現したいこと

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は最新バージョンです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ファイルの更新の仕方がわからないということでしょうか?
案1.別ファイル名で書きだして、クローズしてから、元ファイルを削除して、リネームする。
案2.読み込みオープンした物をクローズしてから、同じファイルを書き込みオープンして上書きする。デメリットとして書き込み中にプログラムが落ちるとデータが失われる。

#コメントを見ての追記
サンプル:数字の書かれたファイルを読んで、数字を+1してファイルを更新する

Ruby

1#案1 2FILENAME="foo" 3FILENAME_NEW=FILENAME+".new" 4n = IO.read(FILENAME).to_i 5n += 1 6open(FILENAME_NEW,"w") do |f| 7 f.write(n) 8end 9File.delete(FILENAME) 10File.rename(FILENAME_NEW, FILENAME) 11 12#案2 13FILENAME="foo" 14n = IO.read(FILENAME).to_i 15n += 1 16open(FILENAME,"w") do |f| 17 f.write(n) 18end

#さらにコメント見て追記

Ruby

1wk = @rest[:volume] 2for a in 0...data do 3for b in 0...datas do 4 #注文リストと在庫リストのマッチングを行う 5 if @rest[:name][b] == @book[:name][a] 6 wk[b]-=1 7 end 8end 9end 10@rest[:volume] = wk 11@rest.to_csv をファイルに書く

forの所は、Arrayの各種メソッドを使えばもっとシンプルに出来ますね。

あと、restやbookをインスタンス変数にしている理由が分かりません。

投稿2017/01/04 08:00

編集2017/01/04 14:42
otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ebitiri

2017/01/04 08: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
ebitiri

2017/01/04 08:35

ここにマッチしたジグの枚数をrest.csvファイルからマイナス1するという処理を入れたいです。 ※ジグの枚数→在庫の数です
otn

2017/01/04 09:15

質問1 ファイルの更新の仕方がわからないということでしょうか? 質問2 わたしの書いた回答の意味がわからないということでしょうか?それとも意味はわかるがコードに出来ないと言うことでしょうか?
ebitiri

2017/01/04 10:25

度々申し訳ございません。 ファイルの更新の仕方がわかりません。(行列を指定して、csvの内容を書き換えて更新する方法)
otn

2017/01/04 10:28

質問2 わたしの書いた回答の意味がわからないということでしょうか?それとも意味はわかるがコードに出来ないと言うことでしょうか?
ebitiri

2017/01/04 10:40

質問2の方ですが、回答の意味は理解していると思うのですが、コードにできません。
ebitiri

2017/01/04 13:24

コードの記入ありがとうございます! コードを見たのですが、この処理だとrest.csvの一致した行のvolume列の値のみを書き換えることができないと思うのですが、いかかでしょうか? 私の質問文の方で、画像を入れれることが分かったので、処理の流れ図を追加しました、何度も申し訳ございませんが確認していただければ幸いです。
otn

2017/01/04 14:22

??ということは、わからないのは「ファイルの更新の仕方」じゃなくて、CSV::Tableデータの部分更新の仕方がわからないということでしょうか?
ebitiri

2017/01/04 14:35

そうです! 説明が不十分で申し訳ございません。
ebitiri

2017/01/04 15:46

実際にコードを動かしたところ、質問していた問題が解決できました。 拙い質問に根気強くお答えいただき本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問