Пример #1
0
def identify_datatypes(get_in, delimiter, columns=[]):
    log = os.path.dirname(get_in) + '/' + os.path.splitext(
        os.path.basename(get_in))[0] + '_warns.log'
    with open(log, 'a+') as warn:
        column = []
        for col in columns:
            col_name, col_dtype = col.split(':')[0:2]
            if 'datetime' in col_dtype:
                meta.write_logs(
                    warn, 'INFO', 'Campo data encontrado ' + col_name,
                    'Campo datetime encontrado -' + col_name + ' ' + col_dtype)
                column.append(col_name)
        df = pd.read_csv(get_in,
                         sep=delimiter,
                         encoding='utf-8',
                         infer_datetime_format=True,
                         parse_dates=column).replace(
                             '\r?\n', ' ', regex=True).replace(delimiter,
                                                               ' ',
                                                               regex=True)
    meta.write_metadata(
        df,
        os.path.dirname(get_in) + '/' +
        os.path.splitext(os.path.basename(get_in))[0].replace('_temp', '') +
        '_metadata.schema')
    return df
Пример #2
0
def required_fields(get_in, fields_required=[]):
    log = os.path.dirname(get_in) + '/' + os.path.splitext(
        os.path.basename(get_in))[0].replace('_temp', '') + '_warns_fields.log'
    with open(log, 'a+') as warn:
        result = False
        try:
            if fields_required != [] and fields_required != ['']:
                heads = meta.get_head(get_in)
                meta.write_logs(
                    warn, 'INFO', 'Campos obrigatórios',
                    'Campos obrigatórios definidos - ' +
                    ','.join(fields_required))
                for field in fields_required:
                    if meta.clean_metadata(';' + field) in heads:
                        meta.write_logs(warn, 'INFO',
                                        'Campo obrigatório encontrado',
                                        'Campo obrigatório - ' + field)
                        result = True
                    else:
                        meta.write_logs(warn, 'ERROR',
                                        'Campo obrigatório não encontrado',
                                        'Campo obrigatório - ' + field)
                        result = False
                meta.write_logs(warn, 'INFO', 'Campos obrigatórios',
                                'Busca por campos obrigatórios finalizado.')
        except:
            meta.write_logs(warn, 'ERROR', 'Campos obrigatórios',
                            'Falha ao identificar campos obrigatórios.')
    return result
Пример #3
0
def verify_file_to_move(get_in, warn, location_raw):
    for r, _, files in os.walk(get_in, topdown=False):
        for f in files:
            if ('.csv' in f or '.schema' in f or '_warns' in f or '.original' in f or '.html' in f) and r == get_in:
                if '_temp' in f: # or ('.txt' in f and '.original' not in f):
                    meta.write_logs(warn, 'WARN', 'Arquivo temporário removido', 'Arquivo removido ' + get_in + f + '.')
                    os.remove(get_in + f)                            
                else:
                    meta.write_logs(warn, 'INFO', 'Movimentação de arquivos', 'Arquivo movido de ' + get_in + f + ' para ' + location_raw + f + '.')
                    os.rename(get_in + f, location_raw + f)
Пример #4
0
def analize_line(warn, i, line, headline, log=True):
    linecount = len(line.split(';'))
    headcount = len(headline.split(';'))
    if (linecount == headcount):
        return False
    else:
        if log:
            meta.write_logs(
                warn, 'WARN',
                'Diferença de colunas encontrado na linha - ' + str(i),
                'Cabeçalho com ' + str(headcount) + ' colunas, encontrado ' +
                str(linecount) + '.')
        return True
Пример #5
0
def convert_type_to_csv(get_in, sheets = [], positional = [], columns_name = []):
    try:
        directory = os.path.dirname(get_in) + '/'
        filename = os.path.splitext(os.path.basename(get_in))    
        get_out = filename[0]    
        log = directory + get_out + '_warns.log'
        m = magic.Magic(mime=True)
        file_type = m.from_file(get_in)
    except:
        with open(log,'a') as warn:   
            meta.write_logs(warn, 'ERROR', 'convert_type_to_csv - Leitura de dados','Arquivo não encontrado.')
    prepare_convert(log, file_type, directory, get_out, filename, get_in, positional, columns_name, sheets)
    return directory + get_out + '.csv'
Пример #6
0
def move_files_csv(warn, get_in, s3_location):
    s3_location = s3_location + '/'
    try:
        #now = datetime.datetime.now()
        location_raw = s3_location.replace(' ', '')
        #for tutorial in ['cadastro', 'faturamento', 'sinistro']:
        #    location_root = os.path.join(s3_location, tutorial).replace(' ', '')
        #    location = os.path.join(location_root, os.path.join(os.path.join('year=' + str(now.year)), 'month=' + str(now.month))).replace(' ', '')
        #    os.makedirs(location, exist_ok=True)
        verify_file_to_move(get_in, warn, location_raw)
        return location_raw + '/warns.log'
    except:
        meta.write_logs(warn, 'ERROR', 'Movimentação de arquivos','Erro ao mover arquivos.')
        return get_in + '/warns.log'
Пример #7
0
def fix_line(warn, i, line, lastline, headline):
    if line != lastline:
        linecount = len(line.split(';')) + len(
            lastline.split(';')) - 1 if lastline != '' else len(
                line.split(';'))
        headcount = len(headline.split(';'))
        if (linecount != headcount):
            if (linecount > headcount):
                meta.write_logs(
                    warn, 'ERROR', 'Impossível corrigir a linha - ' + str(i),
                    'Esperado ' + str(headcount) + ' colunas, encontrado ' +
                    str(linecount) + '. Linha será removida.')
                return ''
            else:
                return (lastline + line).replace('\n', '')
        else:
            return (lastline + line).replace('\n', '')
    return line
Пример #8
0
def type_txt(type, cfg, warn, filename, get_in, sheets, positional, columns_name):
    meta.write_logs(warn, 'INFO', 'Encoding UTF-8','Convertendo arquivo para UTF-8.')
    csv.convert_utf8(get_in + filename)
    if (type == 'positional'):
        positional = cfg.split(';')[0].split(':')[2].split(',')
        columns_name = cfg.split(';')[0].split(':')[3].split(',')
        meta.write_logs(warn, 'INFO', 'Configuração posicional encontrada, arquivo ' + filename,'Config - ' + cfg)
    else: 
        meta.write_logs(warn, 'INFO', 'Configuração texto encontrada, arquivo ' + filename,'Config - ' + cfg)
        fix.search_breakline(os.path.join(get_in, filename))
        meta.write_logs(warn, 'INFO', 'Analisando linhas do arquivo ' + filename,'Analisando e corrigindo quebras de linhas e caracteres especiais.')
    convert_type_to_csv(os.path.join(get_in, filename), sheets=sheets, positional=positional, columns_name=columns_name)
Пример #9
0
def execute_steps(get_in, cfg, filename = ''):
    positional = []
    columns_name = []
    sheets = []
    cfg = cfg.replace('\n', '')
    log = os.path.dirname(get_in + '/') + '/warns.log'
    with open(log,'a') as warn:  
        type = get_value(cfg, ':', 0)
        if type != 'location' and get_value(cfg, ';', get_parameter(type)) != '': 
            csv.date_format = get_value(cfg, ';', get_parameter(type))
            meta.write_logs(warn, 'INFO', 'Formato de data encontrado para o arquivo ' + filename,'date_format = ' + csv.date_format)               
        if type == 'text' or type == 'positional':
            type_txt(type, cfg, warn, filename, get_in, sheets, positional, columns_name)
        elif type == 'excel':
            type_excel(warn, filename, cfg, get_in, sheets, positional, columns_name)
        elif type == 'access':                
            meta.write_logs(warn, 'INFO', 'Configuração Access encontrada, arquivo ' + filename,'Config - ' + cfg)
            convert_type_to_csv(os.path.join(get_in, filename), sheets=sheets, positional=positional, columns_name=columns_name)
        elif type == 'location':   
            meta.write_logs(warn, 'INFO', 'Configuração de localização encontrada','Config - ' + cfg)
            move_files_csv(warn, get_in, cfg.split(';')[0].split(':')[1])
            #meta.write_logs(warn, 'INFO', 'Enviando emails para usuários cadastrados','Config - ' + cfg)
            #try:
            #    email.send_email(os.getenv("EMAIL_SENDER"), cfg.split(';')[1], os.getenv("EMAIL_PASSWORD"))
            #except:
            #    meta.write_logs(warn, 'ERROR', 'Falha ao enviar email','Config - ' + cfg)    
        else:
            type = ''
Пример #10
0
def analyze_and_fix_line(get_in, warn, headline):
    with open(get_in + '.original', 'rt') as file:
        with open(get_in, 'w') as fix_file:
            lastline = ''
            i = 1
            for line in file:
                if i == 1:
                    fix_file.write(headline + '\n')
                else:
                    if (analize_line(warn, i, line, headline)):
                        lastline = fix_line(warn, i, line, lastline, headline)
                        if not (analize_line(
                                warn, i, lastline, headline, log=False)):
                            meta.write_logs(
                                warn, 'INFO', 'Correção das linhas',
                                'Tentativa de correção das linhas, descritas acima.'
                            )
                            fix_file.write(
                                lastline.replace('"', '').strip() + '\n')
                            lastline = ''
                    else:
                        fix_file.write(line.replace('"', '').strip() + '\n')
                i += 1
Пример #11
0
def search_breakline(get_in):
    directory = os.path.dirname(get_in) + '/'
    filename = os.path.splitext(os.path.basename(get_in))
    log = directory + filename[0] + '_warns.log'
    with open(log, 'a+') as warn:
        headline = meta.get_head(get_in)
        meta.write_logs(
            warn, 'INFO', 'Fazendo validação final no arquivo',
            'Iniciando a analise do arquivo - ' + os.path.basename(get_in))
        os.rename(get_in, get_in + '.original')
        meta.write_logs(
            warn, 'INFO', 'Renomeando arquivo original',
            'Renomeando arquivo para ' + os.path.basename(get_in) +
            '.original')
        meta.write_logs(
            warn, 'INFO', 'Chave criada para arquivo original ' +
            os.path.basename(get_in) + '.original',
            'SHA256(' + meta.md5_hash(get_in + '.original') + ').')
        analyze_and_fix_line(get_in, warn, headline)
        meta.write_logs(warn, 'INFO', 'Fazendo validação final no arquivo',
                        'Processo finalizado.')
Пример #12
0
def type_excel(warn, filename, cfg, get_in, sheets, positional, columns_name):
    meta.write_logs(warn, 'INFO', 'Configuração excel encontrada, arquivo ' + filename,'Config - ' + cfg)
    if cfg.split(';')[0].split(':')[2] != '':
        sheets = cfg.split(';')[0].split(':')[2].split(',')
    convert_type_to_csv(os.path.join(get_in, filename), sheets=sheets, positional=positional, columns_name=columns_name)
Пример #13
0
def txt_to_csv(directory, get_out, filename, get_in, warn, file_type, positional, columns_name):
    meta.write_logs(warn, 'DEBUG', 'txt_to_csv','Iniciando processo', debug=DEBUG)
    get_out = directory + get_out + '.csv'                
    if(filename[1] =='.csv'):
        os.rename(get_in, get_in.replace('csv', 'txt'))
        get_in = get_in.replace('csv', 'txt')
    meta.write_logs(warn, 'INFO', 'Arquivo encontrado ' + file_type,'Formato texto plano (txt,csv,tsv).')
    if positional != []:
        meta.write_logs(warn, 'INFO', 'Arquivo posicional encontrado','Padrão ' + str(positional) + '.') 
        for i in range(0, len(positional)): 
            positional[i] = int(positional[i]) 
    meta.write_logs(warn, 'INFO', 'Remoção caracteres especiais','Quebras de linha e delimitador em local incorreto.')                                
    csv.txt_to_csv(get_in, get_out, meta.detect_delimiter(meta.get_head(get_in), positional=positional), columns_name)                
    meta.write_logs(warn, 'INFO','Chave criada ' + get_out, 'SHA256(' +meta. md5_hash(get_out) + ')')
    meta.write_logs(warn, 'DEBUG', 'txt_to_csv','Finalizando processo', debug=DEBUG)
Пример #14
0
def xls_to_csv(directory, get_out, warn, file_type, sheets, get_in):
    meta.write_logs(warn, 'DEBUG', 'xls_to_csv','Iniciando processo', debug=DEBUG)
    get_out = directory + get_out 
    meta.write_logs(warn, 'INFO', 'Arquivo encontrado ' + file_type,'Formato Micrsoft Excel (xls,xlsx).')            
    try:
        if sheets != []:
            for sheet in sheets:
                    meta.write_logs(warn, 'INFO', 'Sheet encontrado ' + sheet,'Criando arquivo csv')
                    csv.excel_to_csv(get_in, get_out, sheet)
                    meta.write_logs(warn, 'INFO', 'Chave ùnica criada ' + get_out + '_' + sheet + '.csv','SHA256(' + meta.md5_hash(get_out + '_' + sheet + '.csv') + ')')
        else:
            meta.write_logs(warn, 'INFO','Arquivo sem sheets', 'Fazendo leitura do excel.')
            csv.excel_to_csv(get_in, get_out)
            meta.write_logs(warn, 'INFO', 'Chave ùnica criada ' + get_out + '.csv','SHA256(' + meta.md5_hash(get_out + '.csv') + ')')
    except:
        meta.write_logs(warn, 'ERROR','xls_to_csv - Falha ao exportar sheet ' + sheet, 'Erro de leitura do excel.')
    meta.write_logs(warn, 'DEBUG', 'xls_to_csv','Finalizando processo', debug=DEBUG)
Пример #15
0
def accdb_to_csv(directory, get_out, warn, file_type, get_in):
    meta.write_logs(warn, 'DEBUG', 'accdb_to_csv','Iniciando processo', debug=DEBUG)
    get_out = directory + get_out
    meta.write_logs(warn, 'INFO', 'Arquivo encontrado ' + file_type, 'Formato Micrsoft Access (mdb,accdb).')
    for table in mdb.list_tables(get_in):
        try:
            meta.write_logs(warn, 'INFO', 'Tabela ' + table, 'Tabela encontrado dentro do arquivo.')
            csv.access_to_csv(get_in, get_out, table)                    
            meta.write_logs(warn, 'INFO', 'Chave ùnica criada ' + get_out + '_' + table + '.csv','SHA256(' + meta.md5_hash(get_out + '_temp_' + table + '.csv') + ')')
        except:
            meta.write_logs(warn, 'ERROR','accdb_to_csv - Falha ao exportar tabela ' + table, 'Erro de leitura na tabela')
    meta.write_logs(warn, 'DEBUG', 'accdb_to_csv','Finalizando processo', debug=DEBUG)            
Пример #16
0
def prepare_convert(log, file_type, directory, get_out, filename, get_in, positional, columns_name, sheets):
    with open(log,'a+') as warn:                        
        meta.write_logs(warn, 'INFO', 'Analisando dados ','Iniciando o processo.')
        try:
            if (file_type == 'text/plain'):   
                meta.write_logs(warn, 'DEBUG', 'prepare_convert','Arquivo texto', debug=DEBUG)
                txt_to_csv(directory, get_out, filename, get_in, warn, file_type, positional, columns_name)
            elif (file_type in ['application/zip', 'application/octet-stream', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet']):
                meta.write_logs(warn, 'DEBUG', 'prepare_convert','Arquivo excel', debug=DEBUG)
                xls_to_csv(directory, get_out, warn, file_type, sheets, get_in)
            elif (file_type == 'application/x-msaccess'):
                meta.write_logs(warn, 'DEBUG', 'prepare_convert','Arquivo Access', debug=DEBUG)
                accdb_to_csv(directory, get_out, warn, file_type, get_in)
            else:
                meta.write_logs(warn, 'ERROR', 'file_type ' + file_type, 'Tipo não encontrado, verifique se é um arquivo válido')         
        except:
            meta.write_logs(warn, 'ERROR', 'prepare_convert - Falha ao preparar arquivo ' + file_type,'erro de leitura do arquivo')