module Libis::Tools::Csv

Public Class Methods

open(file_name, **options) click to toggle source

@param [String] file_name @param [Hash] options @return [CSV] Open CSV object

# File lib/libis/tools/csv.rb, line 10
def self.open(file_name, **options)
  options = {
      mode: 'rb:UTF-8',
      required: %w'',
      optional: %w'',
      col_sep: ',',
      quote_char: '"'
  }.merge options
  mode = options.delete(:mode)
  required_headers = options.delete(:required)
  optional_headers = options.delete(:optional)
  options[:headers] = true
  options[:return_headers] = true
  csv = ::CSV.open(file_name, mode, **options)
  line = csv.shift
  found_headers = required_headers & line.headers
  return csv if found_headers.size == required_headers.size
  raise RuntimeError, "CSV headers not found: #{required_headers - found_headers}" unless found_headers.empty?
  csv.close
  options[:headers] = (required_headers + optional_headers)[0...line.size]
  raise RuntimeError, 'CSV does not contain enough columns' if required_headers.size > line.size
  options[:return_headers] = true
  csv = ::CSV.open(file_name, mode, **options)
  csv.shift
  csv
end