-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathprocessar_questoes_bncc.py
More file actions
154 lines (116 loc) · 4.97 KB
/
processar_questoes_bncc.py
File metadata and controls
154 lines (116 loc) · 4.97 KB
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
import csv
import re
import os
from pathlib import Path
from typing import List, Dict
from supabase import create_client, Client
from dotenv import load_dotenv
load_dotenv()
SUPABASE_URL = os.getenv("SUPABASE_URL", "")
SUPABASE_KEY = os.getenv("SUPABASE_KEY", "")
BATCH_SIZE = 50
WORKSPACE_PATH = Path(__file__).parent
CSV_FOLDERS = ["docs/EF", "docs/EI", "docs/EM"]
CSV_FILENAME = "Lista de questões.csv"
def extrair_codigo_bncc(habilidade: str) -> tuple[str, str]:
match = re.search(r'\((.*?)\)', habilidade)
if match:
codigo_bncc = match.group(1)
descricao_limpa = re.sub(r'\(.*?\)\s*', '', habilidade).strip()
return codigo_bncc, descricao_limpa
return "", habilidade.strip()
def ler_csv(filepath: Path) -> List[Dict]:
dados = []
try:
with open(filepath, 'r', encoding='utf-8') as file:
reader = csv.DictReader(file)
for row in reader:
disciplina = row.get('Disciplina', '').strip()
ano = row.get('Ano', '').strip()
habilidade = row.get('Habilidade', '').strip()
unidade_tematica = row.get('Unidade Temática', '').strip()
objeto_conhecimento = row.get('Objeto do Conhecimento', '').strip()
codigo_bncc, descricao_habilidade = extrair_codigo_bncc(habilidade)
if codigo_bncc:
dados.append({
'disciplina': disciplina if disciplina else None,
'ano': ano if ano else None,
'unidade_tematica': unidade_tematica if unidade_tematica else None,
'objeto_conhecimento': objeto_conhecimento if objeto_conhecimento else None,
'codigo_bncc': codigo_bncc,
'descricao_habilidade': descricao_habilidade if descricao_habilidade else None
})
else:
print(f"Aviso: Código BNCC não encontrado em: {habilidade[:100]}...")
except Exception as e:
print(f"Erro ao ler arquivo {filepath}: {e}")
return dados
def enviar_lote_supabase(client: Client, lote: List[Dict]) -> bool:
try:
response = client.table('base_questoes_bncc').upsert(
lote,
on_conflict='codigo_bncc'
).execute()
return True
except Exception as e:
print(f"Erro ao enviar lote para Supabase: {e}")
return False
def processar_todos_csvs():
print("=" * 80)
print("INICIANDO PROCESSAMENTO DE QUESTOES BNCC")
print("=" * 80)
if not SUPABASE_URL or not SUPABASE_KEY or "seu-projeto" in SUPABASE_URL or "sua-chave" in SUPABASE_KEY:
print("\nERRO: Configure suas credenciais do Supabase no arquivo .env!")
print(" 1. Copie o arquivo .env.example para .env")
print(" 2. Edite o arquivo .env com suas credenciais")
print(" - SUPABASE_URL")
print(" - SUPABASE_KEY")
return
print(f"\nConectando ao Supabase...")
try:
supabase: Client = create_client(SUPABASE_URL, SUPABASE_KEY)
print("Conectado com sucesso!")
except Exception as e:
print(f"Erro ao conectar ao Supabase: {e}")
return
todos_dados = []
for folder in CSV_FOLDERS:
csv_path = WORKSPACE_PATH / folder / CSV_FILENAME
if not csv_path.exists():
print(f"\nArquivo não encontrado: {csv_path}")
continue
print(f"\nProcessando: {csv_path}")
dados = ler_csv(csv_path)
print(f" {len(dados)} registros extraídos")
todos_dados.extend(dados)
if not todos_dados:
print("\nNenhum dado encontrado para processar!")
return
print(f"\nTotal de registros coletados: {len(todos_dados)}")
print(f"\nEnviando dados em lotes de {BATCH_SIZE} registros...")
total_enviado = 0
total_erros = 0
for i in range(0, len(todos_dados), BATCH_SIZE):
lote = todos_dados[i:i + BATCH_SIZE]
lote_num = (i // BATCH_SIZE) + 1
total_lotes = (len(todos_dados) + BATCH_SIZE - 1) // BATCH_SIZE
print(f" Lote {lote_num}/{total_lotes} ({len(lote)} registros)...", end=" ")
if enviar_lote_supabase(supabase, lote):
print("OK")
total_enviado += len(lote)
else:
print("ERRO")
total_erros += len(lote)
print("\n" + "=" * 80)
print("RESUMO DO PROCESSAMENTO")
print("=" * 80)
print(f"Registros enviados com sucesso: {total_enviado}")
print(f"Registros com erro: {total_erros}")
print(f"Total processado: {len(todos_dados)}")
print("=" * 80)
if total_erros == 0:
print("\nProcessamento concluído com sucesso!")
else:
print("\nProcessamento concluído com alguns erros.")
if __name__ == "__main__":
processar_todos_csvs()