Class: Sycsvpro::Counter
- Inherits:
-
Object
- Object
- Sycsvpro::Counter
- Includes:
- Dsl
- Defined in:
- lib/sycsvpro/counter.rb
Overview
Creates a new counter that counts values and uses the values as column names and uses the count as the column value
Instance Attribute Summary collapse
-
#col_filter ⇒ Object
readonly
filter that is used for columns.
-
#heading ⇒ Object
readonly
header of the out file.
-
#infile ⇒ Object
readonly
infile contains the data that is operated on.
-
#key_column ⇒ Object
readonly
values are assigned to the key column.
-
#key_values ⇒ Object
readonly
values that are assigned to the key column.
-
#outfile ⇒ Object
readonly
outfile is the file where the result is written to.
-
#row_filter ⇒ Object
readonly
filter that is used for rows.
-
#sum_row ⇒ Object
readonly
row where to add the sums of the columns of the sum columns.
-
#sum_title ⇒ Object
readonly
Title of the sum row.
-
#sums ⇒ Object
readonly
sums of the column values.
Instance Method Summary collapse
-
#execute ⇒ Object
Executes the counter.
-
#initialize(options = {}) ⇒ Counter
constructor
Creates a new counter.
-
#process_file ⇒ Object
Processes the counting on the in file.
-
#write_result ⇒ Object
Writes the results.
Methods included from Dsl
Constructor Details
#initialize(options = {}) ⇒ Counter
Creates a new counter. Takes as attributes infile, outfile, key, rows, cols, date-format and indicator whether to add a sum row
37 38 39 40 41 42 43 44 45 46 47 48 |
# File 'lib/sycsvpro/counter.rb', line 37 def initialize(={}) @infile = [:infile] @outfile = [:outfile] @key_column = [:key].to_i @row_filter = RowFilter.new([:rows]) @col_filter = ColumnFilter.new([:cols], df: [:df]) @key_values = {} @heading = [] @sum_title, @sum_row = [:sum].split(':') unless [:sum].nil? @sum_row = @sum_row.to_i unless @sum_row.nil? @sums = Hash.new(0) end |
Instance Attribute Details
#col_filter ⇒ Object (readonly)
filter that is used for columns
23 24 25 |
# File 'lib/sycsvpro/counter.rb', line 23 def col_filter @col_filter end |
#heading ⇒ Object (readonly)
header of the out file
27 28 29 |
# File 'lib/sycsvpro/counter.rb', line 27 def heading @heading end |
#infile ⇒ Object (readonly)
infile contains the data that is operated on
15 16 17 |
# File 'lib/sycsvpro/counter.rb', line 15 def infile @infile end |
#key_column ⇒ Object (readonly)
values are assigned to the key column
19 20 21 |
# File 'lib/sycsvpro/counter.rb', line 19 def key_column @key_column end |
#key_values ⇒ Object (readonly)
values that are assigned to the key column
25 26 27 |
# File 'lib/sycsvpro/counter.rb', line 25 def key_values @key_values end |
#outfile ⇒ Object (readonly)
outfile is the file where the result is written to
17 18 19 |
# File 'lib/sycsvpro/counter.rb', line 17 def outfile @outfile end |
#row_filter ⇒ Object (readonly)
filter that is used for rows
21 22 23 |
# File 'lib/sycsvpro/counter.rb', line 21 def row_filter @row_filter end |
#sum_row ⇒ Object (readonly)
row where to add the sums of the columns of the sum columns
31 32 33 |
# File 'lib/sycsvpro/counter.rb', line 31 def sum_row @sum_row end |
#sum_title ⇒ Object (readonly)
Title of the sum row
29 30 31 |
# File 'lib/sycsvpro/counter.rb', line 29 def sum_title @sum_title end |
#sums ⇒ Object (readonly)
sums of the column values
33 34 35 |
# File 'lib/sycsvpro/counter.rb', line 33 def sums @sums end |
Instance Method Details
#execute ⇒ Object
Executes the counter
51 52 53 54 |
# File 'lib/sycsvpro/counter.rb', line 51 def execute process_file write_result end |
#process_file ⇒ Object
Processes the counting on the in file
57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/sycsvpro/counter.rb', line 57 def process_file File.new(infile).each_with_index do |line, index| result = col_filter.process(row_filter.process(line.chomp, row: index)) unless result.nil? or result.empty? key = unstring(line).split(';')[key_column] key_value = key_values[key] || key_values[key] = { name: key, elements: Hash.new(0) } result.chomp.split(';').each do |column| heading << column if heading.index(column).nil? key_value[:elements][column] += 1 sums[column] += 1 end end end end |
#write_result ⇒ Object
Writes the results
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
# File 'lib/sycsvpro/counter.rb', line 73 def write_result sum_line = [sum_title] heading.sort.each do |h| sum_line << sums[h] end row = 0; File.open(outfile, 'w') do |out| out.puts sum_line.join(';') if row == sum_row ; row += 1 out.puts (["key"] + heading.sort).join(';') key_values.each do |k,v| out.puts sum_line.join(';') if row == sum_row ; row += 1 line = [k] heading.sort.each do |h| line << v[:elements][h] end out.puts line.join(';') end end end |