言語はrubyです。
複数のファイル(3つ以上)を読み込んで計算し、出力したいです。
例:
ファイル名:ファイル内
a.txt:2
b.txt:3
c.txt:4
...
のファイルがあったとして
a.txtとb.txt
a.txtとc.txt
b.txtとc.txt
という順で計算したいのですが、どのようにして入力と出力を繰り返せばいいのでしょうか?
(計算は足し算など)
初歩的なことだとは思いますが回答をお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
総合スコア21735
0
まずは、a.txt を読んで、 その中のかいてある数字 + 1 の値を画面の表示するプログラムを書いてみてください。
投稿2016/01/16 22:13
編集2016/06/27 22:25総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。