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

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

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

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

Q&A

解決済

2回答

7560閲覧

rubyで複数ファイルの入力と処理

kamatmt

総合スコア25

Ruby

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

0グッド

1クリップ

投稿2016/01/16 18:38

言語はrubyです。
複数のファイル(3つ以上)を読み込んで計算し、出力したいです。
例:
ファイル名:ファイル内
a.txt:2
b.txt:3
c.txt:4
...
のファイルがあったとして

a.txtとb.txt
a.txtとc.txt
b.txtとc.txt
という順で計算したいのですが、どのようにして入力と出力を繰り返せばいいのでしょうか?
(計算は足し算など)

初歩的なことだとは思いますが回答をお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

要件をまとめるとこんな感じでしょうか?

  • 3つ以上の複数のファイルにデータがある
  • それらのファイルの内1つ以上を組み合わせて、それぞれのファイルにあるデータを足したり引いたりした数が欲しい
  • ファイルの組み合わせは1つでは無くたくさんある
  • それらをなるべく効率よく!!! ←勝手に追加

最後の要件が無ければ単純にそれぞれ毎回ファイルを読み込めばいいのですが、__誰かが__勝手に追加したのでちょっと工夫が必要です。

###準備編 読み込み用の関数を作っとこう
各ファイルを読み込んで、整数としてデータを取得するというのを繰り返すことになると思います。なので、あらかじめそういう処理を関数として用意しておきます。

Ruby

1# filenameのファイルの内容を取得して、それを整数に変換して返す関数 2def read_data_file(filename) 3 【filenameのファイルを開いて中身(文字列)を取得】 4 【取得した文字列を整数に変換】 5 【変換した整数を返す】 6end

※【この部分】は色々書き方があるので、自分で工夫して下さい。

###方法1 最初に全部読み込んでおけばいいんだ
必要なファイルを全部読み込んで、保存しておきます。こういうときに一番役たつのはHashです。

Ruby

1data = {} # Hashを作る 2data["a.txt"] = read_data_file("a.txt") 3data["b.txt"] = read_data_file("b.txt") 4...

※繰りかえしになる部分は、あらかじめ配列にして、eachを使う等工夫するといいでしょう。

こうしておけば、もう何度もファイルを見に行く必要がありません。dataから全部取得可能だからです。a.txtとb.txtにあるデータの足し算が得て、出力する場合は、下記のように書けばいいだけです。

Ruby

1puts data["a.txt"] + data["b.txt"]

###方法2 必要になったら読み込んでそのデータをキャッシュする
方法1には問題があります。用意されるファイルが1万とか膨大なのに対し、計算で使われるファイルが数十個しか無い場合は非常に非効率です。では、計算で使われるファイルが判明したら、それらを単純に毎回見に行くのもやはり非効率です。ということで、必要になったら取りに行くけど、結果はキャッシュとして残しておくという工夫をします。

Ruby

1$data = {} # グローバル変数としてキャッシュ用のHashを持っておく 2def read_data_file_with_cache(filename) 3 if $data.key?(filename) # $dataにキャッシュされているか確認する 4 # キャッシュされていればそのまま返す 5 return $data[filename] 6 else 7 # キャッシュされてなかったので取得し、それをキャッシュに入れる 8 $data[filename] = read_data_file_with_cache(filename) 9 # 取得したデータを返す 10 return $data[filename] 11 end 12end

このような関数を用意しておくと計算部分は下記のように書けます。

Ruby

1puts read_data_file_with_cache("a.txt") + read_data_file_with_cache("b.txt")

これで、各ファイルは1回までしか読み込まれません。また、不要なファイルも読み込まれません。これで、ファイルはたくさんあるけど、実際使うのは少ないと言う場合でも、効率よく出来るようになりました。

さて、上のコードはグローバル変数を使うなど、あまりいいコードとは言えません。これまで作ってきた関数や$dataをまとめるclassを作って、そことやり取りという形にするととてもすっきりします。うまく出来そうであれば、工夫してチャレンジしてみて下さい。

投稿2016/01/16 22:47

raccy

総合スコア21735

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

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

0

まずは、a.txt を読んで、 その中のかいてある数字 + 1 の値を画面の表示するプログラムを書いてみてください。

投稿2016/01/16 22:13

編集2016/06/27 22:25
katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問