Class: FastCSV

Inherits:
CSV
  • Object
show all
Defined in:
lib/fastcsv.rb

Overview

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.raw_parse(*args, &block) ⇒ Object



7
8
9
# File 'lib/fastcsv.rb', line 7

def self.raw_parse(*args, &block)
  Parser.new.raw_parse(*args, &block)
end

Instance Method Details

#pos=(*args) ⇒ Object

CSV’s delegated and overwritten IO methods move the pointer within the file, but FastCSV doesn’t notice, so we need to recreate the fiber. The old fiber is garbage collected.



87
88
89
90
91
# File 'lib/fastcsv.rb', line 87

def pos=(*args)
  super
  @parser = nil
  @fiber = nil
end

#reopen(*args) ⇒ Object



92
93
94
95
96
# File 'lib/fastcsv.rb', line 92

def reopen(*args)
  super
  @parser = nil
  @fiber = nil
end

#rewindObject



102
103
104
105
106
# File 'lib/fastcsv.rb', line 102

def rewind
  super
  @parser = nil
  @fiber = nil
end

#rowObject



11
12
13
# File 'lib/fastcsv.rb', line 11

def row
  parser && parser.row
end

#seek(*args) ⇒ Object



97
98
99
100
101
# File 'lib/fastcsv.rb', line 97

def seek(*args)
  super
  @parser = nil
  @fiber = nil
end

#shiftObject



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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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/fastcsv.rb', line 15

def shift
  # COPY
  # handle headers not based on document content
  if header_row? and @return_headers and
     [Array, String].include? @use_headers.class
    if @unconverted_fields
      return add_unconverted_fields(parse_headers, Array.new)
    else
      return parse_headers
    end
  end
  # PASTE

  # The CSV library wraps File objects, whereas `FastCSV.raw_parse` accepts
  # IO-like objects that implement `#read(length)`.
  begin
    unless csv = fiber.resume # was unless parse = @io.gets(@row_sep)
      return nil
    end
  rescue FiberError
    return nil
  end

  row = parser.row

  # COPY
  if csv.empty?
    #
    # I believe a blank line should be an <tt>Array.new</tt>, not Ruby 1.8
    # CSV's <tt>[nil]</tt>
    #
    if row.empty? # was if parse.empty?
      @lineno += 1
      if @skip_blanks
        return shift # was next
      elsif @unconverted_fields
        return add_unconverted_fields(Array.new, Array.new)
      elsif @use_headers
        return self.class::Row.new(Array.new, Array.new)
      else
        return Array.new
      end
    end
  end
  # PASTE

  return shift if @skip_lines and @skip_lines.match row # was next if @skip_lines and @skip_lines.match parse

  # COPY
  @lineno += 1

  # save fields unconverted fields, if needed...
  unconverted = csv.dup if @unconverted_fields

  # convert fields, if needed...
  csv = convert_fields(csv) unless @use_headers or @converters.empty?
  # parse out header rows and handle CSV::Row conversions...
  csv = parse_headers(csv)  if     @use_headers

  # inject unconverted fields and accessor, if requested...
  if @unconverted_fields and not csv.respond_to? :unconverted_fields
    add_unconverted_fields(csv, unconverted)
  end
  # PASTE

  csv # was break csv
end