2

スペースで区切られた 10 列のデータを含むファイルがあります。私は次のコードを書きました (そしてそれは機能します) が、ここで行っていることを行うためのよりクリーンな方法があると感じています:

#Generate ten separate arrays in which to store the columns
c0 = []; c1 = []; c2 = []; c3 = []; c4 = []; 
c5 = []; c6 = []; c7 = []; c8 = []; c9 = [];

#Append each item in each line to its own array
File.open(filename, 'r').each_line do |line|
  line = line.strip.split(' ')
  c0 << line[0]; c1 << line[1]; c2 << line[2]; c3 << line[3]; c4 << line[4]; 
  c5 << line[5]; c6 << line[6]; c7 << line[7]; c8 << line[8]; c9 << line[9]; 
end

このタスクを達成するためのメソッドを作成しようとしましたが、基本的にどこから始めればよいかわかりません。n 個の配列を初期化するには、私が行った方法よりもクリーンな方法があると思います...それを行う「ルビー」の方法は何ですか? ここで行っているすべてのことを、10 個の配列を返す単一のメソッドで行うことは可能ですか? これを達成する方法についてのヘルプ/ヒントをいただければ幸いです。

4

2 に答える 2

1
File.open(filename, 'r') do |infile|
  c = infile.lines.map(&:split).transpose
end

現在cは、各行が元のファイルの列を表す配列である 2 次元配列ですc[0] = c0

編集:これはおそらく少し密です。いくつかの説明:

infile.lines各要素がファイルの行である配列です。

infile.lines.map(&:split)の略ですinfile.lines.map { |line| line.split }

' '分割するデフォルトの文字です。

transpose列を行に変換します。

于 2013-04-17T01:28:39.670 に答える