require "fileutils" class Cleaner attr_reader :input_filepath, :output_filepath, :log_filepath def initialize(input_filepath:, output_filepath:, log_filepath:) @input_filepath = input_filepath @output_filepath = output_filepath @log_filepath = log_filepath initialize_directories end def clean Dir.glob(Rails.root.join(input_filepath, "*.csv")).each do |filepath| puts filepath File.open(filepath) do |file| processed_data = process_raw_file(file:) processed_data in [headers, clean_csv, log_csv, data] return if data.empty? filename = filename(headers:, data:, filepath:) write_csv(data: clean_csv, output_filepath:, filename:) write_csv(data: log_csv, output_filepath: log_filepath, prefix: "removed.", filename:) end end end def filename(headers:, data:, filepath:) output = [] survey_item_ids = headers.filter(&:present?).filter do |header| header.start_with?("s-", "t-") end.reject { |item| item.end_with? "-1" } survey_type = SurveyItem.survey_type(survey_item_ids:) range = data.first.academic_year.range districts = data.map do |row| row.district.short_name end.to_set.to_a schools = data.map do |row| row.school.name end.to_set part = filepath&.match(/[\b\s_.]+(part)[\W*_](?