Wymored Login

importar dados rais 2017 para postgresql.

04 de julho de 2019 por Alexandre Miguel de Andrade Souza

A primeira etapa é converter o encoding par UTF-8 (exemplo)

iconv -f ISO-8859-1 -t UTF-8 raismg2017.txt -o raismg2017.csv

A segunda etapa é gerar um sql de criação e importar

Ajuste os nomes dos arquivos de origem e destino no arquivo importar.py para gerar o sql de importação

#!/usr/bin/env python3
import csv, os
#pip3 install python-slugify
from slugify import slugify
origem = 'teste.csv'
destino = 'raismg2017.sql'
arquivo = os.path.abspath(origem)

d = open(destino,'w')
with open(origem,'r') as f:

    header = f.readline().split(';')
    head_cells = []
    for cell in header:
        value = slugify(cell,separator="_")
        if value in head_cells:
            value = value+'_2'
        head_cells.append(value)
    #cabecalho = "{}\n".format(';'.join(campos))

    #print(cabecalho)
    fields= []
    for cell in head_cells:
        fields.append(" {} text".format(cell))
    table = origem.split('.')[0]
    sql = "create table {} ( \n {} \n);".format(origem.split('.')[0],",\n".join(fields))
    sql += "\n COPY {} FROM '{}' DELIMITER ';' CSV HEADER;".format(table,arquivo)

    print(sql)
    d.write(sql)

execute com

 python3 importar.py

ou

chmod +x importar.py
./importar.py

opcional

edite o arquivo sql gerado para ter tipos adequados para cada campo.

drop table raismg2017;
create table raismg2017 ( 
bairros_sp text,
bairros_fortaleza text,
bairros_rj text,
causa_afastamento_1 integer,
causa_afastamento_2 integer,
causa_afastamento_3 integer,
motivo_desligamento integer,
cbo_ocupacao_2002 text,
cnae_2_0_classe integer,
cnae_95_classe integer,
distritos_sp text,
vinculo_ativo_31_12 integer,
faixa_etaria integer,
faixa_hora_contrat integer,
faixa_remun_dezem_sm integer,
faixa_remun_media_sm integer,
faixa_tempo_emprego integer,
escolaridade_apos_2005 integer,
qtd_hora_contr integer,
idade integer,
ind_cei_vinculado integer,
ind_simples integer,
mes_admissao integer,
mes_desligamento integer,
mun_trab integer,
municipio integer,
nacionalidade integer,
natureza_juridica integer,
ind_portador_defic integer,
qtd_dias_afastamento integer,
raca_cor integer,
regioes_adm_df integer,
vl_remun_dezembro_nom text,
vl_remun_dezembro_sm text,
vl_remun_media_nom text,
vl_remun_media_sm text,
cnae_2_0_subclasse integer,
sexo_trabalhador integer,
tamanho_estabelecimento integer,
tempo_emprego text,
tipo_admissao integer,
tipo_estab integer,
tipo_estab_2 text,
tipo_defic integer,
tipo_vinculo integer,
ibge_subsetor integer,
vl_rem_janeiro_cc text,
vl_rem_fevereiro_cc text,
vl_rem_marco_cc text,
vl_rem_abril_cc text,
vl_rem_maio_cc text,
vl_rem_junho_cc text,
vl_rem_julho_cc text,
vl_rem_agosto_cc text,
vl_rem_setembro_cc text,
vl_rem_outubro_cc text,
vl_rem_novembro_cc text,
ano_chegada_brasil integer,
ind_trab_parcial integer,
ind_trab_intermitente integer
);

COPY raismg2017 FROM '/home/p/dev/dados/raismg2017.csv' DELIMITER ';' CSV HEADER;

execute o comando para executar o sql

sudo -H -u postgres bash -c "psql trabalho < raismg2017.sql"

Opcional: Altere os tipos dos campos numéricos

alter table raismg2017
alter column vl_remun_dezembro_nom TYPE NUMERIC(15,2) USING CAST(REPLACE(vl_remun_dezembro_nom,',','.') AS NUMERIC(15,2)),
alter column vl_remun_dezembro_sm TYPE NUMERIC(15,2) USING CAST(REPLACE(vl_remun_dezembro_sm,',','.') AS NUMERIC(15,2)),
alter column vl_remun_media_nom TYPE NUMERIC(15,2) USING CAST(REPLACE(vl_remun_media_nom,',','.') AS NUMERIC(15,2)),
alter column vl_remun_media_sm TYPE NUMERIC(15,2) USING CAST(REPLACE(vl_remun_media_sm,',','.') AS NUMERIC(15,2)),
alter column tempo_emprego TYPE NUMERIC(15,2) USING CAST(REPLACE(tempo_emprego,',','.') AS NUMERIC(15,2)),
alter column vl_rem_janeiro_cc TYPE NUMERIC(15,2) USING CAST(REPLACE(vl_rem_janeiro_cc,',','.') AS NUMERIC(15,2)),
alter column vl_rem_fevereiro_cc TYPE NUMERIC(15,2) USING CAST(REPLACE(vl_rem_fevereiro_cc,',','.') AS NUMERIC(15,2)),
alter column vl_rem_marco_cc TYPE NUMERIC(15,2) USING CAST(REPLACE(vl_rem_marco_cc,',','.') AS NUMERIC(15,2)),
alter column vl_rem_abril_cc TYPE NUMERIC(15,2) USING CAST(REPLACE(vl_rem_abril_cc,',','.') AS NUMERIC(15,2)),
alter column vl_rem_maio_cc TYPE NUMERIC(15,2) USING CAST(REPLACE(vl_rem_maio_cc,',','.') AS NUMERIC(15,2)),
alter column vl_rem_junho_cc TYPE NUMERIC(15,2) USING CAST(REPLACE(vl_rem_junho_cc,',','.') AS NUMERIC(15,2)),
alter column vl_rem_julho_cc TYPE NUMERIC(15,2) USING CAST(REPLACE(vl_rem_julho_cc,',','.') AS NUMERIC(15,2)),
alter column vl_rem_agosto_cc TYPE NUMERIC(15,2) USING CAST(REPLACE(vl_rem_agosto_cc,',','.') AS NUMERIC(15,2)),
alter column vl_rem_setembro_cc TYPE NUMERIC(15,2) USING CAST(REPLACE(vl_rem_setembro_cc,',','.') AS NUMERIC(15,2)),
alter column vl_rem_outubro_cc TYPE NUMERIC(15,2) USING CAST(REPLACE(vl_rem_outubro_cc,',','.') AS NUMERIC(15,2)),
alter column vl_rem_novembro_cc TYPE NUMERIC(15,2) USING CAST(REPLACE(vl_rem_novembro_cc,',','.') AS NUMERIC(15,2));