File size: 6,865 Bytes
fa9ba45
 
 
 
7b77e4c
 
 
 
 
 
1cf69d5
7b77e4c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1cf69d5
7b77e4c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1cf69d5
7b77e4c
 
 
fa9ba45
7b77e4c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fa9ba45
 
 
 
9d00020
 
fa9ba45
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import chardet
import pandas as pd
import regex

def iniciar(uploaded_file):
    raw_data = uploaded_file.read()
    result = chardet.detect(raw_data)
    encoding = result["encoding"]
    print(f"Detected encoding: {encoding}")

    uploaded_file.seek(0)
    csv_data = uploaded_file.read().decode(encoding)
    return csv_data

def limpa_rci1(texto):
    sub1 = r"(^e-SUS.+\nMIN(.+\n+){2}.+)|(^CBO.+\n(.+\n+){2}.+)|(^Não\sinf.+\n+Identif.+\nDes.+\nDes.+\nDes.+\nRes.+\n+Iden.+$)|(^Não\sin.+\n+Ident.+Cor$)|(^Não\sin.+\n+Ident.+\nDesc.+\nBra.+\nNat(.+\n+){34}.+)|(^Inf.+\nDesc.+\nAdult.+\n(.+\n+){10}.+)|(^Inf.+\n(Des.+\n){3}.+$)|(^Inf.+\nDesc.+\n(Tem\salg.+\n){1}.+$)|(^Inf.+\nA\slist.+\nDes(.+\n+){8}.+$)|(^Desc.+\nÉ.+\nPossu(.+\n*)*)|(^Não\sinf.+;0.+$)|(;;;;;|;;;;|Ident.+(-|/)\s)|"
    sub2 = r"(^C.*(rin|card|resp).+\n.+\n.+[os]\s)|(;;;\nT.+\nT.+$)|(;Sim|(?<=[az];);|\ssabe;|\s.\sEnfisema)|(^Participa.+$|Poss.+de\s|(?<=privado.;\d\d\d);.+|Poss.+de\s|(?<=privado.;\d\d\d\d);.+)|((Desc.+\n){3}Resp.+$)|(Etnia.+\nD.+\nNã.+$)|(Nacio.+\nDesc.+\nB.+\nNat.+\nEst.+$)|(Infor.+\nDesc.+\nCôn(.+\n){31}Inf.+$)|Deseja\sinf.+$|(Infor.+\nDesc.+\nEmpreg(.+\n){10}.+$)|Intelec.+/\s|((Está\s(com\s)?))|(^Condiç.+\nD.+$)|((Faz\suso.+e\s)|PIC;.+|Tem\s|ou\steve\s|Teve\s|internação.+\nUsa\splant.+$|\s/\sderrame|diagnóst.+de\s)"
    rx_marc = sub1 + "|" + sub2
    texto = regex.sub(rx_marc, "", texto, flags=regex.MULTILINE)
    tira = r"(;;;)"
    texto = regex.sub(tira, "", texto, flags=regex.MULTILINE)
    tira = r"(;;)"
    texto = regex.sub(tira, ";", texto, flags=regex.MULTILINE)
    return texto

def limpa_rci2(texto):
    sub2 = r"(^C.*(rin|card|resp).+\n.+\n.+[os]\s)|(;;;\nT.+\nT.+$)|(;Sim|(?<=[az];);|\ssabe;|\s.\sEnfisema)|(\d+{10}\s-\s)|(^Participa.+$|Poss.+de\s|(?<=privado.;\d\d\d);.+|Poss.+de\s|(?<=privado.;\d\d\d\d);.+)|((Desc.+\n){3}Resp.+$)|(Etnia.+\nD.+\nNã.+$)|(Nacio.+\nDesc.+\nB.+\nNat.+\nEst.+$)|(Infor.+\nDesc.+\nCôn(.+\n){31}Inf.+$)|Deseja\sinf.+$|(Infor.+\nDesc.+\nEmpreg(.+\n){10}.+$)|Intelec.+/\s|((Está\s(com\s)?))|(^Condiç.+\nD.+$)|((Faz\suso.+e\s)|PIC;.+|Tem\s|ou\steve\s|Teve\s|internação.+\nUsa\splant.+$|\s/\sderrame|diagnóst.+de\s)"
    texto = regex.sub(sub2, "", texto, flags=regex.MULTILINE)
    tira = r"(;;;)"
    texto = regex.sub(tira, "", texto, flags=regex.MULTILINE)
    tira = r"(;;)"
    texto = regex.sub(tira, "; ", texto, flags=regex.MULTILINE)
    tira = r"(;$)"
    texto = regex.sub(tira, "", texto, flags=regex.MULTILINE)
    tira = r"(\s\d+{10}\s-\s)"
    texto = regex.sub(tira, "", texto, flags=regex.MULTILINE)
    return texto

def separa_grupos(texto):
    grupos = r"""
        (?P<Data>(Data;\d+/\d+/\d+))|
        (?P<Head>(Equ.+;.+)|Profiss.+l;\w+|((Saíd.+;\d+)|(Cidadã.+;\d+)))|
        (?P<Idade>(^Menos.+(?=;0)|^[0-9][0-9]\s\w).+(?=;0))|
        (?P<genero>(Masc.+;\d+|Fem.+;\d+))|
        (?P<cor>(^(Bra.+;\d+|Pret.+;\d+|Amar.+;\d+|Par.+;\d+|Indí.+;\d+)))|
        (?P<deficiencia>(^(Audi.+a;\d+|Fís.+a;\d+|Cogn.+a;\d+|Vis.+l;\d+|Out.+;\d+)))|
        (?P<doencas>(^(hipert.+al;\d+|diab.+s;\d+|gesta.+e;\d+|acam.+o;\d+|domici.+o;\d+|fuma.+e;\d+|saú.+e;\d+|Asm.+;\d+|DPO.+;\d+|Insufic.+ca;\d+|Insufic.+al;\d+)))|
        (?P<Escola>(Desc.+o;Quant.+\nCre.+e;\d+|Pr.+;\d+|Classe.+;\d+|Ens.+;\d+|Sup.+r;\d+|Alf.+;\d+|Nenhu.+;\d+))|
        (?P<transgen>(Homos.+\);\d+|Bisse.+l;\d+|Hom.+trans.+;\d+|Mul.+trans.+;\d+|Traves.+i;\d+|Transgê.+o;\d+|Não-B.+o;\d+))|
    """
    pattern = regex.compile(grupos, regex.VERBOSE | regex.MULTILINE)

    matches = pattern.finditer(texto)
    grupos_enc = {
        "Data": [],
        "Head": [],
        "Idade": [],
        "genero": [],
        "cor": [],
        "deficiencia": [],
        "doencas": [],
        "Escola": [],
        "transgen": []
    }

    for match in matches:
        for group_name, group_value in match.groupdict().items():
            if group_value and group_name in grupos_enc:
                grupos_enc[group_name].append(group_value)

    return grupos_enc

def criar_dataframe(grupos_encontrados):
    dataframes = {}
    for grupo, valores in grupos_encontrados.items():
        if grupo == "Idade":
            df = pd.DataFrame(valores, columns=["Descrição"])
            df["Masculino"] = df["Descrição"].apply(lambda x: x.split(";")[1])
            df["Feminino"] = df["Descrição"].apply(lambda x: x.split(";")[2])
            df["Descrição"] = df["Descrição"].apply(lambda x: x.split(";")[0])
        else:
            novos_valores = []
            for valor in valores:
                partes = valor.split("\n")
                novos_valores.extend(partes)
            df = pd.DataFrame(novos_valores, columns=["Descrição"])
            df["Valor"] = df["Descrição"].apply(lambda x: x.split(";")[-1])
            df["Descrição"] = df["Descrição"].apply(lambda x: ";".join(x.split(";")[:-1]))
            df["Descrição"] = df["Descrição"].apply(lambda x: x.replace(";", ""))
        dataframes[grupo] = df
    return dataframes

def renomear_escola(df_escola):
    renomeacoes = {
        "Creche": "Creche",
        "Pré-escola (exceto CA)": "Pré-escola",
        "Classe de alfabetização": "Alfabetização",
        "Ensino fundamental 1ª a 4ª séries": "Fundamental 1ª-4ª",
        "Ensino fundamental 5ª a 8ª séries": "Fundamental 5ª-8ª",
        "Ensino fundamental completo": "Fund. Completo",
        "Ensino fundamental especial": "Fund. Especial",
        "Ensino fundamental EJA - séries iniciais (supletivo 1ª a 4ª)": "Fund. EJA Iniciais",
        "Ensino fundamental EJA - séries finais (supletivo 5ª a 8ª)": "Fund. EJA Finais",
        "Ensino médio, médio 2º ciclo (científico, técnico e etc)": "Médio/Científico/Técnico",
        "Ensino médio especial": "Médio Especial",
        "Ensino médio EJA (supletivo)": "Médio EJA",
        "Alfabetização para adultos (Mobral, etc)": "Alfabetização Adultos",
        "Nenhum": "Nenhum"
    }
    df_escola["Descrição"] = df_escola["Descrição"].map(renomeacoes)
    return df_escola

def limpar_dfs(dataframes, regex_pattern, replacement):
    for key, df in dataframes.items():
        df["Descrição"] = df["Descrição"].astype(str).apply(lambda x: regex.sub(regex_pattern, replacement, x))
    return dataframes

def processar_arquivo(uploaded_file):
    csv_data = iniciar(uploaded_file)
    csv_data_limpo = limpa_rci1(csv_data)
    grupos_encontrados = separa_grupos(csv_data_limpo)
    dataframes = criar_dataframe(grupos_encontrados)
    if "Escola" in dataframes:
        dataframes["Escola"] = renomear_escola(dataframes["Escola"])
    clean_final = r"(\sativ\w+)|(\sde\scid.+o)|(iciê.+ia)|((?<=rans)gên.+o|omem|ulher|ário|Homoss.+\(|\))|(\d{10}\s-\s)"
    substituicao = ""
    dataframes = limpar_dfs(dataframes, clean_final, substituicao)
    return dataframes