Browse Source

extract bulk uploading csv parsing to class

pull/1208/head
Phil Lee 3 years ago
parent
commit
7fdd227d38
  1. 58
      app/services/bulk_upload/lettings/csv_parser.rb
  2. 39
      app/services/bulk_upload/lettings/validator.rb

58
app/services/bulk_upload/lettings/csv_parser.rb

@ -0,0 +1,58 @@
require "csv"
class BulkUpload::Lettings::CsvParser
attr_reader :path
def initialize(path:)
@path = path
end
def row_offset
5
end
def col_offset
1
end
def cols
@cols ||= ("A".."EE").to_a
end
def row_parsers
@row_parsers ||= body_rows.map do |row|
stripped_row = row[1..]
headers = ("field_1".."field_134").to_a
hash = Hash[headers.zip(stripped_row)]
# hash[:bulk_upload] = bulk_upload
BulkUpload::Lettings::RowParser.new(hash)
end
end
def body_rows
rows[row_offset..]
end
def rows
@rows ||= CSV.read(path, row_sep:)
end
private
# determine the row seperator from CSV
# Windows will use \r\n
def row_sep
contents = ""
File.open(path, "r") do |f|
contents = f.read
end
if contents[-2..] == "\r\n"
"\r\n"
else
"\n"
end
end
end

39
app/services/bulk_upload/lettings/validator.rb

@ -179,12 +179,16 @@ class BulkUpload::Lettings::Validator
private private
def csv_parser
@csv_parser ||= BulkUpload::Lettings::CsvParser.new(path:)
end
def row_offset def row_offset
5 csv_parser.row_offset
end end
def col_offset def col_offset
1 csv_parser.col_offset
end end
def field_number_for_attribute(attribute) def field_number_for_attribute(attribute)
@ -192,42 +196,27 @@ private
end end
def cols def cols
@cols ||= ("A".."EE").to_a csv_parser.cols
end end
def row_parsers def row_parsers
@row_parsers ||= body_rows.map do |row| return @row_parsers if @row_parsers
stripped_row = row[1..]
headers = ("field_1".."field_134").to_a
hash = Hash[headers.zip(stripped_row)]
hash[:bulk_upload] = bulk_upload
BulkUpload::Lettings::RowParser.new(hash)
end
end
# determine the row seperator from CSV @row_parsers = csv_parser.row_parsers
# Windows will use \r\n
def row_sep
contents = ""
File.open(path, "r") do |f| @row_parsers.each do |row_parser|
contents = f.read row_parser.bulk_upload = bulk_upload
end end
if contents[-2..] == "\r\n" @row_parsers
"\r\n"
else
"\n"
end
end end
def rows def rows
@rows ||= CSV.read(path, row_sep:) csv_parser.rows
end end
def body_rows def body_rows
rows[row_offset..] csv_parser.body_rows
end end
def validate_file_not_empty def validate_file_not_empty

Loading…
Cancel
Save