2

我有一个文件,其中包含十个单独的数据列,由空格分隔。我已经编写了以下代码(并且它有效),但我觉得有一种更简洁的方法来做我在这里所做的事情:

#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

2

也许这段代码有帮助:

   c = []
   File.open(filename, 'r').each_line do |line|
      line = line.strip.split(' ')
      columns = Hash.new
      index=0
      line.each do |column|
        columns[index] = column
        index+=1
      end 
      c.push(columns)
    end

其中每列是一个哈希,按行部分索引,所有行都存储在一个数组中

于 2013-04-17T01:17:25.880 回答
1
File.open(filename, 'r') do |infile|
  c = infile.lines.map(&:split).transpose
end

现在c是一个二维数组,其中每一行都是一个数组,表示原始文件中的一列c[0] = c0,依此类推。

编辑:这可能有点密集。一些解释:

infile.lines是一个数组,其中每个元素都是文件中的一行。

infile.lines.map(&:split)是 的缩写infile.lines.map { |line| line.split }

' '是要拆分的默认字符。

transpose将列转换为行。

于 2013-04-17T01:28:39.670 回答