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
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)))
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)))
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)))