<commit_before># -*- encoding: utf-8 -*-
module SPED2SQL
  class Conversor < Pipeline::Base
    include Layout

    attr_reader :fonte, :template, :saida, :memoria, :options

    def initialize(fonte, template, options = {})
      @fonte      = fonte
      @template   = template.is_a?(Symbol) ? Mapa.arquivo_template(template) : template
      @saida      = []
      @memoria    = {}
      @options    = options

      valida_arquivo(@fonte)
      valida_arquivo(@template)

      tasks = if options[:tasks].is_a?(Array)
                options[:tasks]
              elsif options[:tasks] == :vazio
                []
              else
                [Pipeline::NormalizaSQL, Pipeline::AddHash]
              end

      super(tasks)
    end

    def converter!
      mapa = Mapa.carrega!(@template)
      CSV.foreach(fonte, col_sep: '|', quote_char: "\"", encoding: 'ISO-8859-1') do |row|
        # O primeiro e o ultimo item de uma linha no SPED sempre eh nulo
        linha = row.clone[1..-2] 

        # Executa o pipe
        pipe = execute({ original: linha,
                         final:    linha,
                         mapa:     mapa,
                         memoria:  @memoria,
                         saida:    @saida,
                         options:  @options })

        @saida << pipe[:final]
        @memoria[linha.first] = pipe[:final]

        # Para um arquivo completo do SPED, 9999 eh o ultimo registro
        # termina a leitura do arquivo no registro 9999 evitando ler
        # linhas em branco ou assinatura digital
        break if linha[0].to_i >= 9999 || !mapa.has_key?(linha[0])
      end
    end

    def to_sql
      SQL::Parser.to_sql(@saida, @options[:db] || {})
    end

    private

    def valida_arquivo(file)
      fail(ArgumentError, "Arquivo inexistente: #{file}") unless File.exist?(file)<commit_msg>Resolve problema de encoding e aspas<commit_after># -*- encoding: utf-8 -*-
module SPED2SQL
  class Conversor < Pipeline::Base
    include Layout

    attr_reader :fonte, :template, :saida, :memoria, :options

    def initialize(fonte, template, options = {})
      @fonte      = fonte
      @template   = template.is_a?(Symbol) ? Mapa.arquivo_template(template) : template
      @saida      = []
      @memoria    = {}
      @options    = options

      valida_arquivo(@fonte)
      valida_arquivo(@template)

      tasks = if options[:tasks].is_a?(Array)
                options[:tasks]
              elsif options[:tasks] == :vazio
                []
              else
                [Pipeline::NormalizaSQL, Pipeline::AddHash]
              end

      super(tasks)
    end

    def converter!
      mapa  = Mapa.carrega!(@template)
      dados = IO.read(fonte)
              .force_encoding('ISO-8859-1')
              .encode('utf-8')
              .gsub("'", '"')

      CSV.parse(dados, col_sep: '|', quote_char: "'", encoding: 'ISO-8859-1') do |row|
        next unless mapa.has_key?(row[1])

        # O primeiro e o ultimo item de uma linha no SPED sempre eh nulo
        linha = row.clone[1..-2]

        # Executa o pipe
        pipe = execute({ original: linha,
                         final:    linha,
                         mapa:     mapa,
                         memoria:  @memoria,
                         saida:    @saida,
                         options:  @options })

        @saida << pipe[:final]
        @memoria[linha.first] = pipe[:final]

        # Para um arquivo completo do SPED, 9999 eh o ultimo registro.
        # termina a leitura do arquivo no registro 9999 evitando ler
        # linhas em branco ou assinatura digital
        break if linha[0].to_i == 9999
      end
    end

    def to_sql
      SQL::Parser.to_sql(@saida, @options[:db] || {})
    end

    private

    def valida_arquivo(file)
      fail(ArgumentError, "Arquivo inexistente: #{file}") unless File.exist?(file)
{'fraction_non_alphanumeric': 0.11309062742060419, 'fraction_numerical': 0.013426284533953009, 'mean_word_length': 1.769120800571837, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 4, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3187874', 'n_tokens_mistral': 1259, 'n_tokens_neox': 1200, 'n_words': 293}