Skip to content

Instantly share code, notes, and snippets.

@marcelometal
Last active June 27, 2021 20:29
Show Gist options
  • Save marcelometal/d8411bb9a284ecb662849d5f7a929ebd to your computer and use it in GitHub Desktop.
Save marcelometal/d8411bb9a284ecb662849d5f7a929ebd to your computer and use it in GitHub Desktop.
Eleições 2020: Candidados
// Copyright (c) 2020, Marcelo Jorge Vieira
// Licensed under the MIT License
package main
import (
"encoding/csv"
"fmt"
"io"
"log"
"os"
"path/filepath"
)
// for YEAR in $(seq 2000 2020); do
// wget http://agencia.tse.jus.br/estatistica/sead/odsele/consulta_cand/consulta_cand_$YEAR.zip
// done
const BASE_DIR = "./consulta_cand_2020"
type Cand2020 struct {
DT_GERACAO string
HH_GERACAO string
ANO_ELEICAO string
CD_TIPO_ELEICAO string
NM_TIPO_ELEICAO string
NR_TURNO string
CD_ELEICAO string
DS_ELEICAO string
DT_ELEICAO string
TP_ABRANGENCIA string
SG_UF string
SG_UE string
NM_UE string
CD_CARGO string
DS_CARGO string
SQ_CANDIDATO string
NR_CANDIDATO string
NM_CANDIDATO string
NM_URNA_CANDIDATO string
NM_SOCIAL_CANDIDATO string
NR_CPF_CANDIDATO string
NM_EMAIL string
CD_SITUACAO_CANDIDATURA string
DS_SITUACAO_CANDIDATURA string
CD_DETALHE_SITUACAO_CAND string
DS_DETALHE_SITUACAO_CAND string
TP_AGREMIACAO string
NR_PARTIDO string
SG_PARTIDO string
NM_PARTIDO string
SQ_COLIGACAO string
NM_COLIGACAO string
DS_COMPOSICAO_COLIGACAO string
CD_NACIONALIDADE string
DS_NACIONALIDADE string
SG_UF_NASCIMENTO string
CD_MUNICIPIO_NASCIMENTO string
NM_MUNICIPIO_NASCIMENTO string
DT_NASCIMENTO string
NR_IDADE_DATA_POSSE string
NR_TITULO_ELEITORAL_CANDIDATO string
CD_GENERO string
DS_GENERO string
CD_GRAU_INSTRUCAO string
DS_GRAU_INSTRUCAO string
CD_ESTADO_CIVIL string
DS_ESTADO_CIVIL string
CD_COR_RACA string
DS_COR_RACA string
CD_OCUPACAO string
DS_OCUPACAO string
VR_DESPESA_MAX_CAMPANHA string
CD_SIT_TOT_TURNO string
DS_SIT_TOT_TURNO string
ST_REELEICAO string
ST_DECLARAR_BENS string
NR_PROTOCOLO_CANDIDATURA string
NR_PROCESSO string
CD_SITUACAO_CANDIDATO_PLEITO string
DS_SITUACAO_CANDIDATO_PLEITO string
CD_SITUACAO_CANDIDATO_URNA string
DS_SITUACAO_CANDIDATO_URNA string
ST_CANDIDATO_INSERIDO_URNA string
}
func WalkMatch(root, pattern string) ([]string, error) {
var matches []string
err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if info.IsDir() {
return nil
}
matched, err := filepath.Match(pattern, filepath.Base(path))
if err != nil {
return err
} else if matched {
matches = append(matches, path)
}
return nil
})
if err != nil {
return nil, err
}
return matches, nil
}
func readCSVFile(filename string) []Cand2020 {
csvfile, err := os.Open(
fmt.Sprintf(filename),
)
if err != nil {
log.Fatalln("Couldn't open the CSV file", err)
}
r := csv.NewReader(csvfile)
r.Comma = ';'
var cands []Cand2020
for {
record, err := r.Read()
if err == io.EOF {
break
}
if err != nil {
log.Fatal(err)
}
cand := Cand2020{
DT_GERACAO: record[0],
HH_GERACAO: record[1],
ANO_ELEICAO: record[2],
CD_TIPO_ELEICAO: record[3],
NM_TIPO_ELEICAO: record[4],
NR_TURNO: record[5],
CD_ELEICAO: record[6],
DS_ELEICAO: record[7],
DT_ELEICAO: record[8],
TP_ABRANGENCIA: record[9],
SG_UF: record[10],
SG_UE: record[11],
NM_UE: record[12],
CD_CARGO: record[13],
DS_CARGO: record[14],
SQ_CANDIDATO: record[15],
NR_CANDIDATO: record[16],
NM_CANDIDATO: record[17],
NM_URNA_CANDIDATO: record[18],
NM_SOCIAL_CANDIDATO: record[19],
NR_CPF_CANDIDATO: record[20],
NM_EMAIL: record[21],
CD_SITUACAO_CANDIDATURA: record[22],
DS_SITUACAO_CANDIDATURA: record[23],
CD_DETALHE_SITUACAO_CAND: record[24],
DS_DETALHE_SITUACAO_CAND: record[25],
TP_AGREMIACAO: record[26],
NR_PARTIDO: record[27],
SG_PARTIDO: record[28],
NM_PARTIDO: record[29],
SQ_COLIGACAO: record[30],
NM_COLIGACAO: record[31],
DS_COMPOSICAO_COLIGACAO: record[32],
CD_NACIONALIDADE: record[33],
DS_NACIONALIDADE: record[34],
SG_UF_NASCIMENTO: record[35],
CD_MUNICIPIO_NASCIMENTO: record[36],
NM_MUNICIPIO_NASCIMENTO: record[37],
DT_NASCIMENTO: record[38],
NR_IDADE_DATA_POSSE: record[39],
NR_TITULO_ELEITORAL_CANDIDATO: record[40],
CD_GENERO: record[41],
DS_GENERO: record[42],
CD_GRAU_INSTRUCAO: record[43],
DS_GRAU_INSTRUCAO: record[44],
CD_ESTADO_CIVIL: record[45],
DS_ESTADO_CIVIL: record[46],
CD_COR_RACA: record[47],
DS_COR_RACA: record[48],
CD_OCUPACAO: record[49],
DS_OCUPACAO: record[50],
VR_DESPESA_MAX_CAMPANHA: record[51],
CD_SIT_TOT_TURNO: record[52],
DS_SIT_TOT_TURNO: record[53],
ST_REELEICAO: record[54],
ST_DECLARAR_BENS: record[55],
NR_PROTOCOLO_CANDIDATURA: record[56],
NR_PROCESSO: record[57],
CD_SITUACAO_CANDIDATO_PLEITO: record[58],
DS_SITUACAO_CANDIDATO_PLEITO: record[59],
CD_SITUACAO_CANDIDATO_URNA: record[60],
DS_SITUACAO_CANDIDATO_URNA: record[61],
ST_CANDIDATO_INSERIDO_URNA: record[62],
}
cands = append(cands, cand)
}
return cands
}
func main() {
var allCands []Cand2020
files, err := WalkMatch(BASE_DIR, "*.csv")
if err != nil {
log.Fatal("booom!")
}
for _, file := range files {
cands := readCSVFile(file)
allCands = append(allCands, cands...)
fmt.Println("Processing...", file)
}
fmt.Println("len=>", len(allCands))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment