2.1 Resumo da coleta bash

Trata-se da ETL a partir do repositório do DATASUS desenvolvida em bash-linux. ETL (do inglês, extract, transform, load) é um processo automatizável de extração, transformação e carga em banco de dados. O processo aqui narrado é diferente do proposto pelo Departamento de Informática do SUS - DATASUS via TabWin, cujas vantagens são:

  • Utilização completa da base de dados
  • Modelagem analítica, isto é, maior possibilidade para transposição dinâmica de dados em formato de cubo.
  • Modelagem para estudos epidemiológicos ecológicos, transversais e longitudinais com o universo completo dos dados administrativos.

Comandos bash principais utilizados:

  • listar: curl url
  • baixar: wget url
  • descompactar dbc para dbf: wine dbf2dbc.exe arquivo.dbc
  • converter dbf para csv: dbview -b arquivo.dbf > arquivo.csv

Os comandos curl e wget usualmente são nativos no linux. Os comandos wine e dbview podem ser instalados em distribuições ubuntu com o comando apt install.

Comandos bash secundários:

  • navegação colunar em arquivo texto: awk
  • navegação linear em arquivo texto com busca e substituição: sed
  • recuperação de linhas com expressão regular: grep

2.1.1 Código-fonte resumido

Recupera os arquivos dbc contidos em uma pasta do diretório FTP mantido pelo DATASUS.

url="ftp://ftp.datasus.gov.br/dissemin/publicos/SIASUS/200801_/"

curl $url | egrep -i "dbc$" | awk '{print $4","$3","$1","$2}' | awk -F'[-,]' '{print $1","$2","$5"-"$3"-"$4","$6}' > tmp01.csv # baixa arquivo

Baixa cada arquivo dbc listado.

for line in $(cat tmp01.csv );do
   f=$(echo $line | awk -F',' '{print $1}')
   u=$(echo $line | awk -F',' '{print $NF}')
      
   wget --ignore-case --no-clobber ${u}/${f} # principal: baixa o arquivo dbc
done

Descompacta cada arquivo dbc para dbf e converte para csv.

# descompactador que vem junto com o tabwin
# ftp://ftp.datasus.gov.br/tabwin/tabwin/Tab415.zip
exe="Tab415/dbf2dbc.exe"

# para cada arquivo dbc na pasta local
for file in $(ls | grep -i "\.dbc$");do
   # descompacta o arquivo dbc para dbf
   wine $exe $file 
   
   # recupera o nome do arquivo dbf gerado.
   fdbf=$(echo $file | sed 's/\.DBC$//gI' | awk '{print "ls "$1"* | grep -i DBF"}' | sh)
   # estabelece o nome do arquivo de saida
   fcsv=$(echo $fdbf | sed 's/\.DBF$/\.csv/gI')
   
   # recupera o arquivo csv
   dbview -b $fdbf | sed 's/,/;/g' | sed 's/:/,/g' > $fcsv # PRINCIPAL 2 - converte dbf em csv
   
   # recupera a estrutura do dbf
   dbview -e -o $fdbf | awk -F'\t' '{ gsub(/[ \t]+$/,"",$1);gsub(" ","_",$1); print
done

Carrega arquivo csv no Sistema Gerenciador de Banco de Dados (SGBD) postgresql. É desejável que os arquivos sejam estejam na pasta /tmp/ ou outro diretório com permissão de acesso para o psql.

# para cada arquivo csv da pasta tmp
for file in $(ls | grep -i "\.dbc$");do
   cp $file /tmp/tmp.csv
   sql="COPY db_aux.teste FROM '/tmp/tmp.csv' delimiter ',' csv;")
   PGPASSWORD=SENHA psql -U USUARIO -h localhost -d SCHEMA -p 5432 -c "$sql" -q
done