Class: Reckon::DateColumn

Inherits:
Array
  • Object
show all
Defined in:
lib/reckon/date_column.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(arr = [], options = {}) ⇒ DateColumn

Returns a new instance of DateColumn.



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/reckon/date_column.rb', line 4

def initialize( arr = [], options = {} )
  arr.each do |value|
    if options[:date_format]
      begin
        value = Date.strptime(value, options[:date_format])
      rescue
        puts "I'm having trouble parsing #{value} with the desired format: #{options[:date_format]}"
        exit 1
      end
    else
      value = [$1, $2, $3].join("/") if value =~ /^(\d{4})(\d{2})(\d{2})\d+\[\d+\:GMT\]$/ # chase format
      value = [$3, $2, $1].join("/") if value =~ /^(\d{2})\.(\d{2})\.(\d{4})$/            # german format
      value = [$3, $2, $1].join("/") if value =~ /^(\d{2})\-(\d{2})\-(\d{4})$/            # nordea format
      value = [$1, $2, $3].join("/") if value =~ /^(\d{4})\-(\d{2})\-(\d{2})$/            # yyyy-mm-dd format
      value = [$1, $2, $3].join("/") if value =~ /^(\d{4})(\d{2})(\d{2})/                 # yyyymmdd format


      unless @endian_precedence # Try to detect endian_precedence
        reg_match = value.match( /^(\d\d)\/(\d\d)\/\d\d\d?\d?/ )
        # If first one is not \d\d/\d\d/\d\d\d?\d set it to default
        if !reg_match
          @endian_precedence = [:middle, :little]
        elsif reg_match[1].to_i > 12
          @endian_precedence = [:little]
        elsif reg_match[2].to_i > 12
          @endian_precedence = [:middle]
        end
      end
    end
    self.push( value )
  end
  # if endian_precedence still nil, raise error
  unless @endian_precedence || options[:date_format]
    raise( "Unable to determine date format. Please specify using --date-format" )
  end
end

Instance Attribute Details

#endian_precedenceObject

Returns the value of attribute endian_precedence.



3
4
5
# File 'lib/reckon/date_column.rb', line 3

def endian_precedence
  @endian_precedence
end

Class Method Details

.likelihood(entry) ⇒ Object



59
60
61
62
63
64
65
66
67
68
# File 'lib/reckon/date_column.rb', line 59

def self.likelihood(entry)
  date_score = 0
  date_score += 10 if entry =~ /\b(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i
  date_score += 5 if entry =~ /^[\-\/\.\d:\[\]]+$/
  date_score += entry.gsub(/[^\-\/\.\d:\[\]]/, '').length if entry.gsub(/[^\-\/\.\d:\[\]]/, '').length > 3
  date_score -= entry.gsub(/[\-\/\.\d:\[\]]/, '').length
  date_score += 30 if entry =~ /^\d+[:\/\.-]\d+[:\/\.-]\d+([ :]\d+[:\/\.]\d+)?$/
  date_score += 10 if entry =~ /^\d+\[\d+:GMT\]$/i
  return date_score
end

Instance Method Details

#for(index) ⇒ Object



41
42
43
44
45
46
47
48
49
50
# File 'lib/reckon/date_column.rb', line 41

def for( index )
  value = self.at( index )
  guess = Chronic.parse(value, :context => :past,
                        :endian_precedence => @endian_precedence )
  if guess.to_i < 953236800 && value =~ /\//
    guess = Chronic.parse((value.split("/")[0...-1] + [(2000 + value.split("/").last.to_i).to_s]).join("/"), :context => :past,
                          :endian_precedence => @endian_precedence)
  end
  guess && guess.to_date
end

#pretty_for(index) ⇒ Object



52
53
54
55
56
57
# File 'lib/reckon/date_column.rb', line 52

def pretty_for(index)
  date = self.for(index)
  return "" if date.nil?

  date.iso8601
end