code: def execute
        processed_header = headerless ? true : false
  
        File.open(outfile, 'w') do |out|
          File.open(infile).each_with_index do |line, index|
            line = line.chomp
  
            next if line.empty?
  
            line = unstring(line).chomp
  
            unless processed_header
              header_line = header.process(line)
              out.puts header unless header_line.empty?
              processed_header = true
              next
            end
  
            next if row_filter.process(line, row: index).nil?
  
            values = line.split(';')
            target = values.dup
  
            @positions.sort.each { |p| target.insert(p, "") }
            
            @joiners.each do |joiner|
              key = values[joiner.join[1]]
              row = joiner.lookup[:rows][key] || []
              joiner.pos.each_with_index { |p,i| target[p] = row[i] }
            end
  
            out.puts target.join(';')
          end
        end
      end
docs: Creates a Join which can be invoked as follows
   :call-seq:
     Sycsvpro::Join.new(infile:  "in.csv",
                        outfile: "out.csv",
                        source:  "source.csv",
                        rows:    "1-eof",
                        cols:    "0,1",
                        pos:     "2,3",
                        joins:   "2=1",
                        headerless: true,
                        header:  "*",
                        insert_header: "Company,Phone").execute
  
   infile:: csv file to operate on
   outfile:: csv file with the result
   source:: csv file that contains the values to join to infile
   rows:: rows to consider for operation. Rows that don't match the pattern
          will be skipped for operation
   cols:: columns to insert from the source to the infile
   pos:: column positions where to insert the values and the insert_header
         columns
   joins:: columns that match in infile and source.
           source_column=infile_column
   headerless:: indicates whether the infile has a header (default true)
   header:: Header of the csv file
   insert_header:: column names of the to be inserted values
   Executes the join