Pular para o conteúdo principal

Como abrir arquivos .DBC do DATASUS e converter para CSV/Parquet

Publicado: Atualizado: Por: Komesu, D.K.

Ilustração abstrata em fundo azul-marinho: um bloco cinza compacto à esquerda se abre em dezenas de barras verticais azul-petróleo e vermelhas que se expandem para a direita. Ilustração: Quantilica Editorial
Um bloco compacto se desdobra em camadas: o arquivo .dbc do DATASUS precisa ser descomprimido antes de virar tabela legível.

Guia prático para abrir arquivos .dbc do DATASUS (SIM, SINASC, SIH, SIA, SINAN) sem TabWin: conversão no navegador, pela CLI Quantilica e em Python (datasus-fetcher 0.14.0 ou superior), com exemplo real de um arquivo do SIM e comparação de tamanho entre DBC, DBF, CSV e Parquet.

Um arquivo .dbc do DATASUS é uma tabela DBF (o formato do dBase) comprimida com o algoritmo PKWARE DCL Implode. Por isso o Excel, o LibreOffice e o pandas não o abrem: antes de qualquer análise, o arquivo precisa ser descomprimido para .dbf e, de preferência, convertido para um formato moderno, como CSV (para planilhas) ou Parquet (para análise em Python, R ou SQL).

Há três caminhos que dispensam o TabWin: o conversor do Quantilica no navegador, que gera CSV sem instalar nada; a linha de comando quantilica datasus, que converte arquivos ou pastas inteiras para Parquet; e a biblioteca Python datasus-fetcher, que lê o .dbc direto para um DataFrame. Os três foram testados neste guia com um arquivo real do Sistema de Informações sobre Mortalidade (SIM): as declarações de óbito do Acre em 2022.

Versão mínima: datasus-fetcher 0.14.0. Versões anteriores podiam ler colunas deslocadas em arquivos do DATASUS. Se você gerou Parquets ou CSVs com uma versão mais antiga, refaça a conversão (detalhes na seção Quem converteu com versões anteriores).

O que é um arquivo .dbc do DATASUS

O .dbc é um formato próprio do DATASUS: um cabeçalho DBF seguido dos registros comprimidos pelo algoritmo implode da PKWARE Data Compression Library, o mesmo usado em versões antigas do PKZIP. O DATASUS o adotou nos anos 1990 para reduzir o volume dos microdados distribuídos por FTP e lidos pelo TabWin. A compressão é eficiente (o arquivo deste guia fica 6,2 vezes maior depois de descomprimido), mas nenhuma ferramenta de uso geral a reconhece.

Os detalhes do algoritmo, e por que ler o arquivo bruto é condição de reprodutibilidade, estão em Reprodutibilidade no SUS: como extrair e validar microdados em Python. Aqui o foco é prático: sair do .dbc e chegar a um arquivo que você consiga abrir.

Antes de converter: baixe o arquivo certo

Os microdados ficam no FTP público ftp.datasus.gov.br, sob /dissemin/publicos/. Cada sistema tem uma pasta e uma convenção de nome que combina prefixo do sistema, UF e período:

Sistema Pasta no FTP Exemplo de arquivo Tamanho do .dbc
SIM (óbitos) SIM/CID10/DORES/ DOAC2022.dbc (Acre, 2022) 330.408 bytes
SINASC (nascidos vivos) SINASC/1996_/Dados/DNRES/ DNAC2022.dbc (Acre, 2022) 681.675 bytes
SIH-RD (internações) SIHSUS/200801_/Dados/ RDAC2408.dbc (Acre, ago/2024) 346.250 bytes
SIA-PA (produção ambulatorial) SIASUS/200801_/Dados/ PAAC2607.dbc (Acre, jul/2026) 3.976.061 bytes
SINAN (dengue) SINAN/DADOS/FINAIS/ DENGBR21.dbc (Brasil, 2021) 23.488.890 bytes
CNES-LT (leitos) CNES/200508_/Dados/LT/ LTAC2609.dbc (Acre, set/2026) 3.621 bytes

Se ainda não sabe qual sistema responde à sua pergunta, comece por DATASUS: SIM, SINASC, SIH, SIA ou SINAN? Qual base usar. Para baixar muitos arquivos com interface gráfica, veja Como baixar arquivos do DATASUS com o FileZilla.

Uma armadilha frequente: a extensão varia entre maiúsculas e minúsculas no mesmo diretório. Na pasta do SIM, o Acre tem DOAC2007.DBC, DOAC2010.DBC e DOAC2012.DBC ao lado de DOAC2022.dbc. O servidor aceita as duas grafias no download, mas um script em Linux ou macOS que procure só *.dbc deixa os arquivos .DBC de fora sem avisar.

Em Python, a biblioteca padrão basta para baixar um arquivo:

import urllib.request
from pathlib import Path

URL = "ftp://ftp.datasus.gov.br/dissemin/publicos/SIM/CID10/DORES/DOAC2022.dbc"

dbc = Path("DOAC2022.dbc")
if not dbc.exists():
    urllib.request.urlretrieve(URL, dbc)
print(dbc.name, dbc.stat().st_size, "bytes")

Saída: DOAC2022.dbc 330408 bytes.

Caminho 1: converter no navegador, sem instalar nada

O conversor DBC do Alpaca descomprime o arquivo e gera CSV ou DBF dentro do próprio navegador [1]

. Basta arrastar o .dbc para a página e clicar em Baixar CSV ou Baixar DBF.

Com o DOAC2022.dbc, o conversor produziu 4.159 registros e o primeiro óbito com DTOBITO = 07052022, CAUSABAS = I461 e CODMUNRES = 120017, os mesmos valores que os caminhos 2 e 3 devolvem. O CSV sai em UTF-8 com BOM, separado por vírgula e com os espaços de preenchimento removidos (1,07 MB neste exemplo).

Dois cuidados. No Excel em português, o separador padrão de listas é o ponto e vírgula; abra o arquivo por Dados > De Texto/CSV, que detecta a vírgula, em vez de dar duplo clique. E o conversor carrega o arquivo inteiro na memória do navegador: serve bem para arquivos de uma UF e um período, não para o SIA-PA de São Paulo.

Caminho 2: linha de comando com a CLI Quantilica

A CLI quantilica instala o datasus-fetcher sob demanda a partir do índice de pacotes do projeto (index.quantilica.com). O extra analysis traz Polars, PyArrow e os leitores de DBF, necessários para o comando convert:

python -m venv .venv
source .venv/bin/activate          # no Windows: .venv\Scripts\activate
pip install quantilica-cli
quantilica install datasus --extra analysis

Em um ambiente limpo, esse procedimento instala o datasus-fetcher 0.14.0. Se você já tinha o pacote instalado, atualize explicitamente; a versão publicada no PyPI está desatualizada, por isso o índice do Quantilica precisa estar na linha de comando:

pip install -U "datasus-fetcher[analysis]>=0.14.0" --extra-index-url https://index.quantilica.com/simple/

Com o pacote instalado, a descompressão pura (DBC para DBF) e a conversão para Parquet são dois comandos:

# DBC -> DBF (aceita um arquivo ou uma pasta)
quantilica datasus decompress -i DOAC2022.dbc -o DOAC2022.dbf

# DBC (ou DBF) -> Parquet, arquivo a arquivo ou pasta inteira
quantilica datasus convert -i DOAC2022.dbc -o DOAC2022.parquet
quantilica datasus convert -i pasta_com_dbc/ -o parquet/ --format parquet --workers 4

O convert aplica por padrão a limpeza canônica (--clean), deixa os nomes de coluna em minúsculas (--lowercase) e acrescenta as colunas uf e ano, extraídas do nome do arquivo. Use --no-clean --no-lowercase para manter os campos exatamente como vêm do DATASUS e --compression snappy se o seu leitor não suportar zstd. Numa pasta com DOAC2010.DBC e DOAC2022.dbc, o comando converteu os dois, com extensão maiúscula ou minúscula.

O convert não gera CSV. Para CSV, use o caminho 1 ou o 3.

Caminho 3: Python, do DBC ao DataFrame, CSV e Parquet

Comece conferindo a versão instalada:

from importlib.metadata import version

versao = version("datasus-fetcher")
print("datasus-fetcher", versao)
major, minor = (int(x) for x in versao.split(".")[:2])
assert (major, minor) >= (0, 14), "Atualize o datasus-fetcher para 0.14.0 ou superior"

O fluxo completo cabe em poucas linhas. decompress_dbc grava o .dbf ao lado do original (útil se você quer guardar o DBF); read_dbc descomprime num arquivo temporário e devolve um DataFrame Polars. Com clean=False, lowercase=False, a leitura é crua: nomes originais, todos os campos como texto e a coluna técnica _deleted, que marca registros apagados no DBF e pode ser descartada.

import urllib.request
from pathlib import Path

from datasus_fetcher import decompress_dbc, read_dbc

URL = "ftp://ftp.datasus.gov.br/dissemin/publicos/SIM/CID10/DORES/DOAC2022.dbc"
dbc = Path("DOAC2022.dbc")
if not dbc.exists():
    urllib.request.urlretrieve(URL, dbc)

# 1. DBC -> DBF (opcional: o read_dbc faz isso sozinho num arquivo temporário)
dbf = decompress_dbc(dbc)

# 2. DBC -> DataFrame Polars, sem limpeza: nomes originais e tudo como texto
df = read_dbc(dbc, clean=False, lowercase=False).drop("_deleted")
print(df.shape)
print(df.select("DTOBITO", "CAUSABAS", "CODMUNRES", "SEXO", "IDADE").head(3))

# 3. DataFrame -> CSV e Parquet
df.write_csv("DOAC2022.csv")
df.write_parquet("DOAC2022.parquet", compression="zstd")

for arquivo in (dbc, dbf, Path("DOAC2022.csv"), Path("DOAC2022.parquet")):
    print(f"{arquivo.name:<18}{arquivo.stat().st_size:>12,} bytes")

Saída (com Polars 1.41; o tamanho do Parquet varia alguns bytes entre versões do Polars):

(4159, 87)
┌──────────┬──────────┬───────────┬──────┬───────┐
│ DTOBITO  ┆ CAUSABAS ┆ CODMUNRES ┆ SEXO ┆ IDADE │
╞══════════╪══════════╪═══════════╪══════╪═══════╡
│ 07052022 ┆ I461     ┆ 120017    ┆ 1    ┆ 446   │
│ 14052022 ┆ I10      ┆ 120017    ┆ 2    ┆ 463   │
│ 28052022 ┆ Q201     ┆ 120050    ┆ 2    ┆ 401   │
└──────────┴──────────┴───────────┴──────┴───────┘
DOAC2022.dbc          330,408 bytes
DOAC2022.dbf        2,040,728 bytes
DOAC2022.csv        1,444,770 bytes
DOAC2022.parquet      203,105 bytes

Para análise, prefira a leitura com limpeza, informando o identificador do conjunto de dados (sim-do-cid10, sinasc-dn, sih-rd, sia-pa, sinan-deng, cnes-lt). O wrangle_datasus, aplicado internamente, remove _deleted, padroniza os nomes em minúsculas e converte os campos numéricos conhecidos de cada sistema (valores e diárias do SIH, por exemplo); códigos como SEXO e RACACOR continuam texto, para não perder zeros à esquerda. A função também pode ser chamada sobre um DataFrame lido com clean=False. O trecho abaixo faz ainda uma conferência simples: toda causa básica deve ter formato de código CID-10.

import urllib.request
from pathlib import Path

from datasus_fetcher import read_dbc

URL = "ftp://ftp.datasus.gov.br/dissemin/publicos/SIM/CID10/DORES/DOAC2022.dbc"
dbc = Path("DOAC2022.dbc")
if not dbc.exists():
    urllib.request.urlretrieve(URL, dbc)

df = read_dbc(dbc, dataset="sim-do-cid10")  # limpeza canônica + colunas minúsculas

# Conferência: toda causa básica deve ter formato CID-10 (letra + 2 ou 3 dígitos)
cid_ok = df["causabas"].str.contains(r"^[A-Z][0-9]{2,3}$").sum()
print(f"{cid_ok} de {df.height} causas básicas no formato CID-10")
print("1º registro:", df.row(0, named=True)["causabas"])

capitulos = df["causabas"].str.slice(0, 1).value_counts(sort=True)
print(capitulos.head(5))

Saída: 4159 de 4159 causas básicas no formato CID-10, primeiro registro I461, e os cinco capítulos mais frequentes: I (doenças do aparelho circulatório, 910 óbitos), J (respiratório, 629), C (neoplasias, 567), R (causas mal definidas, 323) e X (causas externas do grupo X, 302).

Se o destino for o Excel em português, grave com ponto e vírgula e BOM, e o duplo clique passa a abrir as colunas certas:

import urllib.request
from pathlib import Path

from datasus_fetcher import read_dbc

URL = "ftp://ftp.datasus.gov.br/dissemin/publicos/SIM/CID10/DORES/DOAC2022.dbc"
dbc = Path("DOAC2022.dbc")
if not dbc.exists():
    urllib.request.urlretrieve(URL, dbc)

df = read_dbc(dbc, clean=False, lowercase=False).drop("_deleted")

# CSV para abrir com duplo clique no Excel em português: ponto e vírgula e BOM UTF-8
df.write_csv("DOAC2022_excel.csv", separator=";", include_bom=True)
print(Path("DOAC2022_excel.csv").read_bytes()[:40])

Quem converteu com versões anteriores

O DATASUS grava zerado, no cabeçalho de cada .dbf, o campo que indica a posição de cada coluna dentro do registro. O leitor rápido usado pelo datasus-fetcher (fastdbf) confiava nesse campo e, nas versões anteriores à 0.14.0, lia vários campos a partir do início do registro. O resultado eram colunas deslocadas: no DOAC2022.dbc, CAUSABAS vinha como " 120" em vez de I461, e DTOBITO como " 1207052" em vez de 07052022.

A versão 0.14.0 recalcula as posições a partir dos tamanhos dos campos antes da leitura e compara as primeiras 50 linhas de cada bloco lido com o dbfread, um leitor independente; se houver divergência, o bloco é relido pelo dbfread e um aviso é registrado no log. O arquivo de origem não é alterado.

Na prática:

  • Parquets, CSVs e DataFrames gerados com read_dbc, read_dbf ou quantilica datasus convert em versões anteriores à 0.14.0 devem ser refeitos a partir dos .dbc originais.
  • Os .dbf gerados por decompress_dbc ou quantilica datasus decompress não foram afetados: a descompressão estava correta, o problema era só a leitura.
  • O conversor do navegador (caminho 1) calcula as posições pelos tamanhos dos campos e não teve esse problema.
  • Uma verificação rápida é a do bloco anterior: em arquivos do SIM, causabas fora do padrão de código CID-10 indica leitura incorreta.

Quanto ocupa cada formato

O mesmo arquivo, medido em disco depois de cada etapa:

Formato Tamanho Relação com o .dbc Para que serve
.dbc (FTP) 330.408 bytes 1,0× Distribuição; nada abre direto
.dbf 2.040.728 bytes 6,2× Compatibilidade com R, Stata, TabWin
.csv 1.444.770 bytes 4,4× Excel, LibreOffice, qualquer linguagem
.parquet (zstd) cerca de 203.000 bytes 0,6× Análise em Python, R, DuckDB, Spark
Gráfico de barras horizontais comparando o tamanho do mesmo arquivo do SIM: DBC 0,33 MB, DBF 2,04 MB, CSV 1,44 MB e Parquet 0,20 MB.
Figura 1: Tamanho em disco do arquivo DOAC2022 (SIM, Acre, 2022) em cada formato. Conversão com datasus-fetcher 0.14.0.Quantilica Analytics

O Parquet fica menor que o próprio .dbc porque é colunar: valores repetidos de uma mesma coluna (UF, sexo, códigos de município) comprimem muito melhor juntos do que registro a registro. Além disso, guarda os tipos de dados e permite ler só as colunas necessárias. A recomendação é guardar o .dbc original como fonte, trabalhar em Parquet e gerar CSV apenas quando alguém precisar abrir no Excel.

O fator de expansão varia por sistema: o PAAC2607.dbc do SIA-PA (Acre, julho de 2026) tem 3.976.061 bytes e vira um .dbf de 58.776.824 bytes, quase 15 vezes maior.

Problemas comuns

  • Acentuação quebrada. Os DBF do DATASUS usam Latin-1 (ISO-8859-1). O read_dbc e o read_dbf já usam encoding="latin1" por padrão; se ler o .dbf com outra ferramenta, informe essa codificação.
  • Zeros à esquerda sumindo. Códigos de município, CNES, CID e ocupação devem ser lidos como texto. Abrir o CSV com duplo clique no Excel converte 0101 em 101; importe a coluna como texto.
  • Datas como texto. No SIM, DTOBITO vem no formato DDMMAAAA (07052022). Converta explicitamente, por exemplo com pl.col("dtobito").str.to_date("%d%m%Y") no Polars.
  • Idade codificada. No SIM, IDADE tem três dígitos e o primeiro indica a unidade: 446 significa 46 anos (unidade 4, anos). Consulte o dicionário do sistema antes de tratar o campo como número.
  • Layout que muda entre anos. O DOAC2010 tem 60 colunas e o DOAC2022, 87. Ao empilhar anos, use concatenação que tolere colunas diferentes (pl.concat(..., how="diagonal_relaxed")).
  • Arquivos grandes. O read_dbf lê arquivos grandes em blocos (chunk_bytes) para limitar o uso de memória; mesmo assim, converta arquivo a arquivo e grave em Parquet antes de juntar UFs e meses.
  • Extensão .DBC maiúscula. Ao listar arquivos em Python, use um padrão que ignore a caixa, como [p for p in pasta.iterdir() if p.suffix.lower() == ".dbc"].

Se, depois de converter, você quiser cruzar os microdados com séries econômicas (população, inflação, gasto público), veja o guia API gratuita de dados econômicos do Brasil em Python.

Perguntas Frequentes

Como abrir um arquivo .dbc do DATASUS no Excel?

O Excel não abre .dbc diretamente, porque o arquivo é um DBF comprimido. Converta-o antes para CSV, no conversor do navegador ou em Python com read_dbc e write_csv, e abra o CSV pelo menu Dados > De Texto/CSV.

Como converter DBC para CSV sem instalar o TabWin?

Pelo conversor do Alpaca no navegador, que não exige instalação e não envia o arquivo a nenhum servidor, ou em Python com o datasus-fetcher 0.14.0 ou superior: read_dbc(arquivo, clean=False).write_csv("saida.csv"). A CLI quantilica datasus convert gera Parquet e DBF, não CSV.

Como ler arquivos .dbc em Python?

Instale o datasus-fetcher com o extra analysis (quantilica install datasus --extra analysis) e use from datasus_fetcher import read_dbc. A função devolve um DataFrame Polars; para pandas, chame .to_pandas() no resultado.

Qual a diferença entre .dbc e .dbf?

O .dbf é a tabela no formato dBase, legível por R, Stata, LibreOffice e bibliotecas Python. O .dbc é o mesmo conteúdo comprimido pelo algoritmo PKWARE DCL Implode, formato que só o DATASUS usa; no exemplo deste guia, o DBF é 6,2 vezes maior que o DBC.

Parquet ou CSV: qual formato usar para microdados do SUS?

Parquet para análise: no exemplo, ocupou cerca de 203 KB contra 1,44 MB do CSV, preserva tipos e permite ler só as colunas necessárias. CSV quando o arquivo precisa ser aberto em planilha ou enviado a alguém sem ferramentas de dados.

Converti arquivos antes da versão 0.14.0 do datasus-fetcher. Preciso refazer?

Sim, se a conversão usou read_dbc, read_dbf ou quantilica datasus convert: essas leituras podiam deslocar colunas. Atualize para a 0.14.0 ou superior e converta de novo a partir dos .dbc; os .dbf gerados só por descompressão continuam válidos.

Referências técnicas

  1. BRASIL. Ministério da Saúde. DATASUS. Transferência de arquivos. Brasília. Disponível em: https://datasus.saude.gov.br/transferencia-de-arquivos/.
  2. BRASIL. Ministério da Saúde. DATASUS. Informações de Saúde (TABNET). Brasília. Disponível em: https://datasus.saude.gov.br/informacoes-de-saude-tabnet/.
  3. BRASIL. Ministério da Saúde. DATASUS. CID-10: Classificação Estatística Internacional de Doenças e Problemas Relacionados à Saúde. Disponível em: http://www2.datasus.gov.br/cid10/V2008/cid10.htm.
  4. DBASE LLC. Xbase file format description (dBASE 7 table file format). Disponível em: https://www.dbase.com/Knowledgebase/INT/db7_file_fmt.htm.
  5. APACHE SOFTWARE FOUNDATION. Apache Parquet documentation. Disponível em: https://parquet.apache.org/docs/.
  6. POLARS. DataFrame.write_csv / DataFrame.write_parquet: API reference. Disponível em: https://docs.pola.rs/api/python/stable/reference/api/polars.DataFrame.write_csv.html.
  7. QUANTILICA. Índice de pacotes Python do ecossistema Quantilica. Disponível em: https://index.quantilica.com/simple/.

Leia também: DATASUS: qual base usar · Reprodutibilidade no SUS em Python · Baixar arquivos do DATASUS com o FileZilla · API gratuita de dados econômicos em Python