Ejemplo n.º 1
0
def read_data(arquivo, empresas_colnomes, empresas_colspecs, header_colnomes, header_colspecs, socios_colnomes,
              socios_colspecs, trailler_colnomes, trailler_colspecs):
    dados = read_cfwf(arquivo,
                      type_width=1,
                      colspecs={'0': header_colspecs,
                                '1': empresas_colspecs,
                                '2': socios_colspecs,
                                '6': CNAES_COLSPECS,
                                '9': trailler_colspecs},
                      names={'0': header_colnomes,
                             '1': empresas_colnomes,
                             '2': socios_colnomes,
                             '6': CNAES_COLNOMES,
                             '9': trailler_colnomes},
                      dtype={'1': EMPRESAS_DTYPE,
                             '2': SOCIOS_DTYPE},
                      chunksize=CHUNKSIZE,
                      encoding='ISO-8859-15')
    return dados
Ejemplo n.º 2
0
def cnpj_full(input_path, tipo_output, output_path):
    total_empresas = 0
    controle_empresas = 0
    total_socios = 0
    controle_socios = 0
    total_cnaes = 0
    controle_cnaes = 0

    if tipo_output == 'sqlite':
        import sqlite3
        conBD = sqlite3.connect(os.path.join(output_path, NOME_ARQUIVO_SQLITE))

    dados = read_cfwf(input_path,
                      type_width=1,
                      colspecs={
                          '0': HEADER_COLSPECS,
                          '1': EMPRESAS_COLSPECS,
                          '2': SOCIOS_COLSPECS,
                          '6': CNAES_COLSPECS,
                          '9': TRAILLER_COLSPECS
                      },
                      names={
                          '0': HEADER_COLUNAS,
                          '1': EMPRESAS_COLUNAS,
                          '2': SOCIOS_COLUNAS,
                          '6': CNAES_COLUNAS,
                          '9': TRAILLER_COLUNAS
                      },
                      dtype={
                          '1': EMPRESAS_DTYPE,
                          '2': SOCIOS_DTYPE
                      },
                      chunksize=CHUNKSIZE)

    for i, dado in enumerate(dados):
        print('Processando bloco {}: até linha {}.'.format(
            i + 1, (i + 1) * CHUNKSIZE),
              end='\r')

        for tipo_registro, df in dado.items():

            if tipo_registro == '1':  # empresas
                total_empresas += len(df)

                # Troca datas zeradas por vazio
                df['data_opc_simples'] = (df['data_opc_simples'].where(
                    df['data_opc_simples'] != '00000000', ''))
                df['data_exc_simples'] = (df['data_exc_simples'].where(
                    df['data_exc_simples'] != '00000000', ''))
                df['data_sit_especial'] = (df['data_sit_especial'].where(
                    df['data_sit_especial'] != '00000000', ''))

            elif tipo_registro == '2':  # socios
                total_socios += len(df)

                # Troca cpf invalido por vazio
                df['cpf_repres'] = (df['cpf_repres'].where(
                    df['cpf_repres'] != '***000000**', ''))
                df['nome_repres'] = (df['nome_repres'].where(
                    df['nome_repres'] != 'CPF INVALIDO', ''))

                # Se socio for tipo 1 (cnpj), deixa campo intacto, do contrario,
                # fica apenas com os ultimos 11 digitos
                df['cnpj_cpf_socio'] = (df['cnpj_cpf_socio'].where(
                    df['tipo_socio'] == '1', df['cnpj_cpf_socio'].str[-11:]))

            elif tipo_registro == '6':  # cnaes_secundarios
                total_cnaes += len(df)

                # Verticaliza tabela de associacao de cnaes secundarios,
                # mantendo apenas os validos (diferentes de 0000000)
                df = pd.melt(df,
                             id_vars=[CNAES_COLUNAS[0]],
                             value_vars=range(99),
                             var_name='cnae_ordem',
                             value_name='cnae')

                df = df[df['cnae'] != '0000000']

            elif tipo_registro == '0':  # header
                print('\nINFORMACOES DO HEADER:')

                header = df.iloc[0, :]

                for k, v in header.items():
                    print('{}: {}'.format(k, v))

                # Para evitar que tente armazenar dados de header
                continue

            elif tipo_registro == '9':  # trailler
                print('\nINFORMACOES DE CONTROLE:')

                trailler = df.iloc[0, :]

                controle_empresas = int(
                    trailler['Total de registros de empresas'])
                controle_socios = int(trailler['Total de registros de socios'])
                controle_cnaes = int(
                    trailler['Total de registros de CNAEs secundarios'])

                print('Total de registros de empresas: {}'.format(
                    controle_empresas))
                print(
                    'Total de registros de socios: {}'.format(controle_socios))
                print('Total de registros de CNAEs secundarios: {}'.format(
                    controle_cnaes))
                print('Total de registros incluindo header e trailler: {}'.
                      format(
                          int(trailler[
                              'Total de registros incluindo header e trailler']
                              )))

                # Para evitar que tente armazenar dados de trailler
                continue

            if tipo_output == 'csv':
                if i > 0:
                    replace_append = 'a'
                    header = False
                else:
                    replace_append = 'w'
                    header = True

                nome_arquivo_csv = REGISTROS_TIPOS[tipo_registro] + '.csv'
                df.to_csv(os.path.join(output_path, nome_arquivo_csv),
                          header=header,
                          mode=replace_append,
                          index=False,
                          quoting=csv.QUOTE_NONNUMERIC)

            elif tipo_output == 'sqlite':
                replace_append = 'append' if i > 0 else 'replace'

                df.to_sql(REGISTROS_TIPOS[tipo_registro],
                          con=conBD,
                          if_exists=replace_append,
                          index=False)

    if tipo_output == 'sqlite':
        conBD.close()

    # Imprime totais
    print('\nConversao concluída. Validando quantidades:')

    inconsistente = False

    print('Total de registros de empresas: {}'.format(total_empresas), end=' ')
    if total_empresas == controle_empresas:
        print('ok')
    else:
        print('!INCONSISTENTE!')
        inconsistente = True

    print('Total de registros de socios: {}'.format(total_socios), end=' ')
    if total_socios == controle_socios:
        print('ok')
    else:
        print('!INCONSISTENTE!')
        inconsistente = True

    print('Total de registros de CNAEs: {}'.format(total_cnaes), end=' ')
    if total_cnaes == controle_cnaes:
        print('ok')
    else:
        print('!INCONSISTENTE!')
        inconsistente = True

    if inconsistente:
        print(
            u'Atenção! Foi detectada inconsistência entre as quantidades lidas e as informações de controle do arquivo.'
        )

    if tipo_output == 'csv':
        print(u'Arquivos CSV gerados na pasta {}.'.format(output_path))

    elif tipo_output == 'sqlite':
        print(u'''
Arquivo SQLITE gerado: {}
OBS: Uso de índices altamente recomendado!
              '''.format(os.path.join(output_path, NOME_ARQUIVO_SQLITE)))
Ejemplo n.º 3
0
def cnpj_full(input_list, tipo_output, output_path):
    total_empresas = 0
    controle_empresas = 0
    total_socios = 0
    controle_socios = 0
    total_cnaes = 0
    controle_cnaes = 0

    if not os.path.exists(output_path):
        os.makedirs(output_path)

    if tipo_output == 'sqlite':
        import sqlite3
        conBD = sqlite3.connect(os.path.join(output_path, NOME_ARQUIVO_SQLITE))

    header_colnomes = list(list(zip(*HEADER_COLUNAS))[0])
    empresas_colnomes = list(list(zip(*EMPRESAS_COLUNAS))[0])
    socios_colnomes = list(list(zip(*SOCIOS_COLUNAS))[0])
    trailler_colnomes = list(list(zip(*TRAILLER_COLUNAS))[0])

    header_colspecs = list(list(zip(*HEADER_COLUNAS))[1])
    empresas_colspecs = list(list(zip(*EMPRESAS_COLUNAS))[1])
    socios_colspecs = list(list(zip(*SOCIOS_COLUNAS))[1])
    trailler_colspecs = list(list(zip(*TRAILLER_COLUNAS))[1])

    # Itera sobre sequencia de arquivos (p/ suportar arquivo dividido pela RF)
    for i_arq, arquivo in enumerate(input_list):
        print('Processando arquivo: {}'.format(arquivo))

        dados = read_cfwf(arquivo,
                          type_width=1,
                          colspecs={
                              '0': header_colspecs,
                              '1': empresas_colspecs,
                              '2': socios_colspecs,
                              '6': CNAES_COLSPECS,
                              '9': trailler_colspecs
                          },
                          names={
                              '0': header_colnomes,
                              '1': empresas_colnomes,
                              '2': socios_colnomes,
                              '6': CNAES_COLNOMES,
                              '9': trailler_colnomes
                          },
                          dtype={
                              '1': EMPRESAS_DTYPE,
                              '2': SOCIOS_DTYPE
                          },
                          chunksize=CHUNKSIZE,
                          encoding='ISO-8859-15')

        # Itera sobre blocos (chunks) do arquivo
        for i_bloco, bloco in enumerate(dados):
            print(
                'Bloco {}: até linha {}. [Emps:{}|Socios:{}|CNAEs:{}]'.format(
                    i_bloco + 1, (i_bloco + 1) * CHUNKSIZE, total_empresas,
                    total_socios, total_cnaes),
                end='\r')

            for tipo_registro, df in bloco.items():

                if tipo_registro == '1':  # empresas
                    total_empresas += len(df)

                    # Troca datas zeradas por vazio
                    df[EMP_DATA_OPC_SIMPLES] = (df[EMP_DATA_OPC_SIMPLES].where(
                        df[EMP_DATA_OPC_SIMPLES] != '00000000', ''))
                    df[EMP_DATA_EXC_SIMPLES] = (df[EMP_DATA_EXC_SIMPLES].where(
                        df[EMP_DATA_EXC_SIMPLES] != '00000000', ''))
                    df[EMP_DATA_SIT_ESPECIAL] = (
                        df[EMP_DATA_SIT_ESPECIAL].where(
                            df[EMP_DATA_SIT_ESPECIAL] != '00000000', ''))

                elif tipo_registro == '2':  # socios
                    total_socios += len(df)

                    # Troca cpf invalido por vazio
                    df[SOC_CPF_REPRES] = (df[SOC_CPF_REPRES].where(
                        df[SOC_CPF_REPRES] != '***000000**', ''))
                    df[SOC_NOME_REPRES] = (df[SOC_NOME_REPRES].where(
                        df[SOC_NOME_REPRES] != 'CPF INVALIDO', ''))

                    # Se socio for tipo 1 (cnpj), deixa campo intacto, do contrario,
                    # fica apenas com os ultimos 11 digitos
                    df[SOC_CNPJ_CPF_SOCIO] = (df[SOC_CNPJ_CPF_SOCIO].where(
                        df[SOC_TIPO_SOCIO] == '1',
                        df[SOC_CNPJ_CPF_SOCIO].str[-11:]))

                elif tipo_registro == '6':  # cnaes_secundarios
                    total_cnaes += len(df)

                    # Verticaliza tabela de associacao de cnaes secundarios,
                    # mantendo apenas os validos (diferentes de 0000000)
                    df = pd.melt(df,
                                 id_vars=[CNA_CNPJ],
                                 value_vars=range(99),
                                 var_name=CNA_ORDEM,
                                 value_name=CNA_CNAE)

                    df = df[df[CNA_CNAE] != '0000000']

                elif tipo_registro == '0':  # header
                    print('\nINFORMACOES DO HEADER:')

                    header = df.iloc[0, :]

                    for k, v in header.items():
                        print('{}: {}'.format(k, v))

                    # Para evitar que tente armazenar dados de header
                    continue

                elif tipo_registro == '9':  # trailler
                    print('\nINFORMACOES DE CONTROLE:')

                    trailler = df.iloc[0, :]

                    controle_empresas = int(
                        trailler['Total de registros de empresas'])
                    controle_socios = int(
                        trailler['Total de registros de socios'])
                    controle_cnaes = int(
                        trailler['Total de registros de CNAEs secundarios'])

                    print('Total de registros de empresas: {}'.format(
                        controle_empresas))
                    print('Total de registros de socios: {}'.format(
                        controle_socios))
                    print('Total de registros de CNAEs secundarios: {}'.format(
                        controle_cnaes))
                    print(
                        'Total de registros incluindo header e trailler: {}'.
                        format(
                            int(trailler[
                                'Total de registros incluindo header e trailler']
                                )))

                    # Para evitar que tente armazenar dados de trailler
                    continue

                if tipo_output == 'csv':
                    if (i_arq + i_bloco) > 0:
                        replace_append = 'a'
                        header = False
                    else:
                        replace_append = 'w'
                        header = True

                    nome_arquivo_csv = REGISTROS_TIPOS[tipo_registro] + '.csv'
                    df.to_csv(os.path.join(output_path, nome_arquivo_csv),
                              header=header,
                              mode=replace_append,
                              index=False,
                              quoting=csv.QUOTE_NONNUMERIC)

                elif tipo_output == 'sqlite':
                    replace_append = 'append' if (i_arq +
                                                  i_bloco) > 0 else 'replace'

                    df.to_sql(REGISTROS_TIPOS[tipo_registro],
                              con=conBD,
                              if_exists=replace_append,
                              index=False)

    if tipo_output == 'sqlite':
        conBD.close()

    # Imprime totais
    print('\nConversao concluida. Validando quantidades:')

    inconsistente = False

    print('Total de registros de empresas: {}'.format(total_empresas), end=' ')
    if total_empresas == controle_empresas:
        print('ok')
    else:
        print('!INCONSISTENTE!')
        inconsistente = True

    print('Total de registros de socios: {}'.format(total_socios), end=' ')
    if total_socios == controle_socios:
        print('ok')
    else:
        print('!INCONSISTENTE!')
        inconsistente = True

    print('Total de registros de CNAEs: {}'.format(total_cnaes), end=' ')
    if total_cnaes == controle_cnaes:
        print('ok')
    else:
        print('!INCONSISTENTE!')
        inconsistente = True

    if inconsistente:
        print(
            u'Atencao! Foi detectada inconsistencia entre as quantidades lidas e as informacoes de controle do arquivo.'
        )

    if tipo_output == 'csv':
        print(u'Arquivos CSV gerados na pasta {}.'.format(output_path))

    elif tipo_output == 'sqlite':
        print(u'''
Arquivo SQLITE gerado: {}
OBS: Uso de índices altamente recomendado!
              '''.format(os.path.join(output_path, NOME_ARQUIVO_SQLITE)))
Ejemplo n.º 4
0
def cnpj_full(input_path, tipo_output, output_path):

    if tipo_output == 'sqlite':
        import sqlite3
        conBD = sqlite3.connect(os.path.join(output_path,NOME_ARQUIVO_SQLITE))

    dados = read_cfwf(input_path, 
                      type_width=1, 
                      colspecs= {'1':EMPRESAS_COLSPECS,
                                 '2':SOCIOS_COLSPECS,
                                 '6':CNAES_COLSPECS},
                      names={'1': EMPRESAS_COLUNAS, 
                             '2': SOCIOS_COLUNAS,
                             '6': CNAES_COLUNAS},
                      dtype={'1': EMPRESAS_DTYPE,
                         '2': SOCIOS_DTYPE},
                      chunksize=CHUNKSIZE)

    for i, dado in enumerate(dados):
        print('Processando bloco {}: até linha {}.'.format(i+1,(i+1)*CHUNKSIZE), 
              end='\r')

        for tipo_registro, df in dado.items():

            if tipo_registro == '1': # empresas
                # Troca datas zeradas por vazio
                df['data_opc_simples'] = (df['data_opc_simples']
                        .where(df['data_opc_simples'] != '00000000',''))
                df['data_exc_simples'] = (df['data_exc_simples']
                        .where(df['data_exc_simples'] != '00000000',''))
                df['data_sit_especial'] = (df['data_sit_especial']
                        .where(df['data_sit_especial'] != '00000000',''))

            elif tipo_registro == '2': # socios
                # Troca cpf invalido por vazio
                df['cpf_repres'] = (df['cpf_repres']
                        .where(df['cpf_repres'] != '***000000**',''))
                df['nome_repres'] = (df['nome_repres']
                        .where(df['nome_repres'] != 'CPF INVALIDO',''))  

                # Se socio for tipo 1 (cnpj), deixa campo intacto, do contrario, 
                # fica apenas com os ultimos 11 digitos
                df['cnpj_cpf_socio'] = (df['cnpj_cpf_socio']
                        .where(df['tipo_socio'] == '1',
                               df['cnpj_cpf_socio'].str[-11:]))

            elif tipo_registro == '6': # cnaes_secundarios       
                # Verticaliza tabela de associacao de cnaes secundarios,
                # mantendo apenas os validos (diferentes de 0000000)
                df = pd.melt(df, 
                             id_vars=[CNAES_COLUNAS[0]], 
                             value_vars=range(99),
                             var_name='cnae_ordem', 
                             value_name='cnae')

                df = df[df['cnae'] != '0000000']

            if tipo_output == 'csv':
                if i > 0:
                    replace_append = 'a'
                    header=False
                else:
                    replace_append = 'w'
                    header=True

                nome_arquivo_csv = REGISTROS_TIPOS[tipo_registro] + '.csv'
                df.to_csv(os.path.join(output_path,nome_arquivo_csv), 
                          header=header,
                          mode=replace_append,
                          index=False,
                          quoting=csv.QUOTE_NONNUMERIC)

            elif tipo_output == 'sqlite':
                replace_append = 'append' if i > 0 else 'replace' 
                    
                df.to_sql(REGISTROS_TIPOS[tipo_registro], 
                          con=conBD, 
                          if_exists=replace_append, 
                          index=False)

    print('\nProcessamento concluído!')
    if tipo_output == 'csv':
        print(u'''
            Arquivos CSV gerados na pasta {}. 
            '''.format(output_path))

    elif tipo_output == 'sqlite':
        conBD.close()
        print(u'''
            Arquivo SQLITE gerado: {}
            OBS: Uso de índices altamente recomendado!
            '''.format(os.path.join(output_path,NOME_ARQUIVO_SQLITE)))