Module: RemoteTable::Delimited
- Defined in:
- lib/remote_table/delimited.rb
Overview
Parses plaintext comma-separated (CSV), tab-separated (TSV), or really anything-delimited files using Ruby’s CSV parser.
Constant Summary collapse
- Engine =
::FasterCSV
Class Method Summary collapse
-
.extended(base) ⇒ Object
Delimited uses Plaintext.
Instance Method Summary collapse
-
#_each ⇒ Object
Yield each row using Ruby’s CSV parser (FasterCSV on Ruby 1.8).
- #csv_options ⇒ Object
- #headers ⇒ Object
- #preprocess! ⇒ Object
Class Method Details
.extended(base) ⇒ Object
Delimited uses Plaintext.
5 6 7 |
# File 'lib/remote_table/delimited.rb', line 5 def self.extended(base) base.extend Plaintext end |
Instance Method Details
#_each ⇒ Object
Yield each row using Ruby’s CSV parser (FasterCSV on Ruby 1.8).
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 |
# File 'lib/remote_table/delimited.rb', line 25 def _each Engine.new(local_copy.encoded_io, .merge(headers: headers)).each do |row| some_value_present = false if not headers # represent the row as an array array = row.map do |v| v = RemoteTable.normalize_whitespace v if not some_value_present and not keep_blank_rows and v.present? some_value_present = true end v end if some_value_present or keep_blank_rows yield array end else # represent the row as a hash hash = ::ActiveSupport::OrderedHash.new row.each do |k, v| v = RemoteTable.normalize_whitespace v if not some_value_present and not keep_blank_rows and v.present? some_value_present = true end hash[k] = v end if some_value_present or keep_blank_rows yield hash end end end ensure local_copy.cleanup end |
#csv_options ⇒ Object
65 66 67 68 69 70 71 |
# File 'lib/remote_table/delimited.rb', line 65 def { skip_blanks: !keep_blank_rows, col_sep: delimiter, quote_char: quote_char, } end |
#headers ⇒ Object
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
# File 'lib/remote_table/delimited.rb', line 73 def headers return @_headers if defined?(@_headers) @_headers = case @headers when FalseClass, NilClass false when :first_row, TrueClass i = 0 begin line = local_copy.encoded_io.gets.strip end while line.length == 0 proto_headers = Engine.parse_line(line, ) if proto_headers proto_headers.map do |v| header = RemoteTable.normalize_whitespace v header.present? ? header : "untitled_#{i+=1}" end else raise "No headers found in first line: #{line.inspect}" end when Array @headers else raise "Invalid headers: #{headers.inspect}" end end |
#preprocess! ⇒ Object
17 18 19 20 21 22 |
# File 'lib/remote_table/delimited.rb', line 17 def preprocess! delete_harmful! convert_eol_to_unix! transliterate_whole_file_to_utf8! skip_rows! end |