Class: TabReader

Inherits:
Object
  • Object
show all
Defined in:
lib/tabreader/version.rb,
lib/tabreader/reader.rb

Overview

note: for now TabReader is a class!!! NOT a module - change - why? why not?

Constant Summary collapse

MAJOR =

todo: namespace inside version or something - why? why not??

0
MINOR =
1
PATCH =
0
VERSION =
[MAJOR,MINOR,PATCH].join('.')

Class Method Summary collapse

Class Method Details



16
17
18
# File 'lib/tabreader/version.rb', line 16

def self.banner
  "tabreader/#{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
end

.foreach(path, headers: false) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/tabreader/reader.rb', line 56

def self.foreach( path, headers: false )
  if headers.is_a?( Array )
    columns = headers
  else
    columns = nil    ## header row a.k.a. columns / fields
  end

	File.open( path, 'r:utf-8' ).each_line do |line|
		pp line
		values = parse_line( line )
		if headers  ## add values as name/value pairs e.g. array of hashes
			if columns.nil?
				columns = values    ## first row is header row
			else
				pairs = columns.zip(values)
				h = pairs.to_h
				yield( h )
			end
		else       ## add values as is e.g. array of array
			yield( values )
		end
	end

	# return nil
	nil
end

.header(path) ⇒ Object



97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/tabreader/reader.rb', line 97

def self.header( path )
  line =  File.open( path, 'r:utf-8' ) do |f|
     if f.eof?
			 ## handle empty file; return empty string; no readline call possible
			 ##  todo/check: return nil from header is no header or [] - why? why not?
			 ##   or throw exception  end of file reached (EOFError) - why? why not?
			  ""
		 else
			 f.readline
		 end
  end

  ## note: line includes \n or \r\n at the end
  ## pp line
  parse_line( line )
end

.parse(txt, headers: false) ⇒ Object

use parse_rows or parse_lines for array or array results



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/tabreader/reader.rb', line 24

def self.parse( txt, headers: false )   ## use parse_rows or parse_lines for array or array results
   rows = []

   if headers.is_a?( Array )
     columns = headers
   else
     columns = nil    ## header row a.k.a. columns / fields
   end

   txt.each_line do |line|
     values = parse_line( line )
     if headers  ## add values as name/value pairs e.g. array of hashes
       if columns.nil?
         columns = values    ## first row is header row
       else
         ## note: will cut-off values if values.size > columns.size
         ##   add warning/error - why? why not?
         ##  if values.size <= columns.size will get filled-up with nil
         pairs = columns.zip(values)
         ## pp pairs
         h = pairs.to_h
         ## pp h

         rows << h
       end
     else       ## add values as is e.g. array of array
       rows << values
     end
   end
   rows
end

.parse_line(line) ⇒ Object



84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/tabreader/reader.rb', line 84

def self.parse_line( line )
  ## check - can handle comments and blank lines too - why? why not?
  ## remove trailing newlines

  ##  note: chomp('') if is an empty string,
  ##    it will remove all trailing newlines from the string.
	##    use line.sub(/[\n\r]*$/, '') or similar instead - why? why not?
  line = line.chomp('')

  values = line.split("\t")
  values
end

.read(path, headers: false) ⇒ Object



17
18
19
20
21
22
# File 'lib/tabreader/reader.rb', line 17

def self.read( path, headers: false )
  txt = File.open( path, 'r:utf-8' ).read
	## puts "#{path}:"
  ## pp txt
  parse( txt, headers: headers )
end

.rootObject



20
21
22
# File 'lib/tabreader/version.rb', line 20

def self.root
  File.expand_path( File.dirname(File.dirname(File.dirname(__FILE__))) )
end

.versionObject



12
13
14
# File 'lib/tabreader/version.rb', line 12

def self.version
  VERSION
end