Class: MetricTools::Table

Inherits:
Object
  • Object
show all
Defined in:
lib/metric_tools/table.rb

Overview

2次元配列のデータ構造を簡単に扱うためのクラス

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeTable

Returns a new instance of Table.



10
11
12
# File 'lib/metric_tools/table.rb', line 10

def initialize
  @_inner_data = {}
end

Class Method Details

.create(rows, cols, &proc) ⇒ Object

Tableクラスのインスタンスを生成します

表の幅、高さを指定し、内容をブロックで指定します。 ブロックの返り値が、表の(i, j)の位置に入ります。

Table.create(10, 5) {|i, j|
  return "set to (#{i}, #{j})"
}


23
24
25
26
# File 'lib/metric_tools/table.rb', line 23

def create(rows, cols, &proc)
  table = Table.new
  table.build(rows, cols, &proc)
end

.create_with_array(array) ⇒ Object

Tableクラスのインスタンスを生成します

2次元配列を元にTableクラスに変換します。

array = [[1, 2, 3], [4, 5, 6], [9, 0, '#']]
Table.create_with_array(array)


34
35
36
37
38
# File 'lib/metric_tools/table.rb', line 34

def create_with_array(array)
  Table.create(array.length, array[0].length) {|i, j|
    array[i][j]
  }
end

Instance Method Details

#[](i, j) ⇒ Object

インデクサを用いてアクセスします 表の大きさを超えていると nilが返ります。

table[1, 10]


47
48
49
# File 'lib/metric_tools/table.rb', line 47

def [](i, j)
  @_inner_data[index_to_key(i, j)]
end

#[]=(i, j, val) ⇒ Object

インデクサを用いてアクセスします 表の大きさを超えているとき、自動的に拡張します

table[1, 10] = val


56
57
58
59
60
# File 'lib/metric_tools/table.rb', line 56

def []=(i, j, val)
  raise "can't specify negative number for position." if i < 0 || j < 0

  @_inner_data[index_to_key(i, j)] = val
end

#add_below(table) ⇒ Object



100
101
102
103
104
105
# File 'lib/metric_tools/table.rb', line 100

def add_below(table)
  table.each_with_index{|cell, i, j|
    self[i, j+self.height] = cell
  }
  self
end

#build(rows, cols, &proc) ⇒ Object



243
244
245
246
247
248
249
250
# File 'lib/metric_tools/table.rb', line 243

def build(rows, cols, &proc)
  for i in 0..rows-1
    for j in 0..cols-1
      @_inner_data[index_to_key(i, j)] = proc.call(i, j)
    end
  end
  self
end

#collect(&proc) ⇒ Object



179
180
181
182
183
184
# File 'lib/metric_tools/table.rb', line 179

def collect(&proc)
  new_one = Table.create(self.rows, self.cols){|i, j|
    proc.call(self[i, j], i, j)
  }
  new_one
end

#colsObject

tableの幅(列数)を取得します



77
78
79
# File 'lib/metric_tools/table.rb', line 77

def cols
  self.width
end

#each(&proc) ⇒ Object

全データに対して処理を行います

table.each {|cell|
  cell += 10
}


160
161
162
163
164
# File 'lib/metric_tools/table.rb', line 160

def each(&proc)
  @_inner_data.keys.each{|key|
    proc.call(@_inner_data[key])
  }
end

#each_with_index(&proc) ⇒ Object

全データに対して処理を行います。(i, j)にデータの座標が入ります。

table.each {|cell, i, j|
  cell = i + j * table.width
}


172
173
174
175
176
177
# File 'lib/metric_tools/table.rb', line 172

def each_with_index(&proc)
  @_inner_data.keys.each{|key|
    i, j = key_to_index(key)
    proc.call(@_inner_data[key], i, j)
  }
end

#headerObject

一行目を配列で返します



110
111
112
113
114
115
116
# File 'lib/metric_tools/table.rb', line 110

def header
  ret = []
  for i in 0...self.width
    ret[i] = self[0, i]
  end
  ret
end

#heightObject

tableの高さ(行数)を取得します



84
85
86
87
88
89
90
91
# File 'lib/metric_tools/table.rb', line 84

def height
  max = 0
  for key in @_inner_data.keys
    i, j = key_to_index(key)
    max = i if max < i
  end
  return max + 1
end

#output_csv_file(path) ⇒ Object

csvファイルとして出力します



218
219
220
# File 'lib/metric_tools/table.rb', line 218

def output_csv_file(path)
  output_file_with_seperator(",", path)
end

#output_file_with_seperator(s, path) ⇒ Object



229
230
231
232
233
234
235
236
237
238
239
240
241
# File 'lib/metric_tools/table.rb', line 229

def output_file_with_seperator(s, path)
  puts "start output >> #{path}..."

  ret = ''
  to_a.each{|row|
    ret << row.join(s) + "\n"
  }

  File.open(path, 'w') {|fp|
    fp.write ret
  }
  puts "finish"
end

#output_tsv_file(path) ⇒ Object

tsvファイルとして出力します



225
226
227
# File 'lib/metric_tools/table.rb', line 225

def output_tsv_file(path)
  output_file_with_seperator("\t", path)
end

コンソールにcsv形式で出力します



198
199
200
# File 'lib/metric_tools/table.rb', line 198

def print_csv
  print_with_seperator(",")
end

コンソールにtsv形式で出力します



205
206
207
# File 'lib/metric_tools/table.rb', line 205

def print_for_docs
  print_with_seperator("\t")
end

コンソールに綺麗な表形式で出力します(Hirbを使用)



191
192
193
# File 'lib/metric_tools/table.rb', line 191

def print_pretty
  puts Hirb::Helpers::Table.render @data.to_a, :headers => @headers, :resize => false
end


209
210
211
212
213
# File 'lib/metric_tools/table.rb', line 209

def print_with_seperator(s)
  to_a.each{|row|
    puts row.join(s)
  }
end

#rowsObject

tableの高さ(行数)を取得します



96
97
98
# File 'lib/metric_tools/table.rb', line 96

def rows
  self.height
end

#to_aObject

2次元配列を返します。自身は変更されません。

table.to_a => [[1,2,3], [4,5,6], [9,0,'#']]


122
123
124
125
126
127
128
129
130
131
# File 'lib/metric_tools/table.rb', line 122

def to_a
  ret = []
  @_inner_data.each{|key, val|
    i, j = key_to_index(key)

    ret[i] ||= []
    ret[i][j] = val
  }
  ret
end

#to_objObject

一行目をkeyとしたhashのarrayとして返します。 自身は変更されません。



137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# File 'lib/metric_tools/table.rb', line 137

def to_obj
  ret = []
  self.header.each_with_index do |key, index|
    @_inner_data.each do |k, val|
      i, j = key_to_index(k)

      next if i == 0 # when header row

      if j == index
        ret[i-1] ||= {}
        ret[i-1][key] = val
      end
    end
  end
  ret
end

#widthObject

tableの幅(列数)を取得します



65
66
67
68
69
70
71
72
# File 'lib/metric_tools/table.rb', line 65

def width
  max = 0
  for key in @_inner_data.keys
    i, j = key_to_index(key)
    max = j if max < j
  end
  return max + 1
end