# frozen_string_literal: true module ImportScripts module CsvHelper class RowResolver def load(row) @row = row end def self.create(cols) Class.new(RowResolver).new(cols) end def initialize(cols) cols.each_with_index do |col, idx| self .class .public_send(:define_method, col.downcase.gsub(/[\W]/, "_").squeeze("_")) { @row[idx] } end end end def csv_parse(filename, col_sep = ",") first = true row = nil current_row = +"" double_quote_count = 0 File .open(filename) .each_line do |line| line.strip! current_row << "\n" unless current_row.empty? current_row << line double_quote_count += line.scan('"').count next if double_quote_count % 2 == 1 # this row continues on a new line. don't parse until we have the whole row. raw = begin CSV.parse(current_row, col_sep: col_sep) rescue CSV::MalformedCSVError => e puts e.message puts "*" * 100 puts "Bad row skipped, line is: #{line}" puts puts current_row puts puts "double quote count is : #{double_quote_count}" puts "*" * 100 current_row = "" double_quote_count = 0 next end[ 0 ] if first row = RowResolver.create(raw) current_row = "" double_quote_count = 0 first = false next end row.load(raw) yield row current_row = "" double_quote_count = 0 end end end end