Se você está trabalhando com bases públicas de CNPJ em CSV, organizar corretamente no banco de dados é essencial para performance e análise. Abaixo está um exemplo simples de como modelar essas informações no MySQL
Estrutura das planilhas
Você normalmente terá 3 arquivos principais:
1. Estabelecimentos
Contém dados detalhados como endereço, CNAE, contatos e situação cadastral.
CNPJ BÁSICO
CNPJ
ORDEM
CNPJ DV
IDENTIFICADOR MATRIZ/FILIAL
NOME
FANTASIA
SITUAÇÃO CADASTRAL
DATA SITUAÇÃO
CADASTRAL
MOTIVO SITUAÇÃO CADASTRAL
NOME DA CIDADE NO
EXTERIOR
PAIS
DATA DE INÍCIO ATIVIDADE
CNAE FISCAL
PRINCIPAL
CNAE FISCAL SECUNDÁRIA
TIPO DE
LOGRADOURO
LOGRADOURO
NÚMERO
COMPLEMENTO
BAIRRO
CEP
UF
MUNICÍPIO
DDD
1
TELEFONE 1
DDD 2
TELEFONE 2
DDD DO
FAX
FAX
CORREIO ELETRÔNICO
SITUAÇÃO ESPECIAL
DATA
DA SITUAÇÃO ESPECIAL
2. Empresas
Informações gerais da empresa, como razão social, natureza jurídica e capital.
CNPJ BÁSICO
RAZÃO SOCIAL / NOME EMPRESARIAL
NATUREZA JURÍDICA
QUALIFICAÇÃO DO RESPONSÁVEL
CAPITAL SOCIAL DA EMPRESA
PORTE DA EMPRESA
ENTE FEDERATIVO RESPONSÁVEL
3. Simples Nacional
Dados sobre enquadramento no Simples e MEI.
CNPJ BÁSICO
OPÇÃO PELO SIMPLES
DATA DE OPÇÃO PELO SIMPLES
DATA DE EXCLUSÃO DO SIMPLES
OPÇÃO PELO MEI
DATA DE OPÇÃO PELO MEI
DATA DE EXCLUSÃO DO MEI
Criando a tabela empresas0
CREATE TABLE empresas0 (
cnpj_basico VARCHAR(8),
razao_social VARCHAR(255),
natureza_juridica VARCHAR(4),
qualificacao_responsavel VARCHAR(2),
capital_social DECIMAL(15,2),
porte_empresa VARCHAR(2),
ente_federativo_responsavel VARCHAR(255)
);
Importando dados para TABELAS criadas
tabela: empresas0
Ao fazer o donwnload do arquivo publico empresas (empresas0, empresas1...etc) o arquivo vem com o formato .EMPRECSV.
Colocamos o arquivo no seguinte local: C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\
Utilizamos
um script PYTHON para colocar o arquivo no formato .tf8:
arquivo_origem = r"C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\K3241.K03200Y0.D60110.EMPRECSV"
arquivo_destino = r"C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\K3241.K03200Y0.D60110.EMPRECSV.utf8.csv"
# Tentar abrir como UTF-8
try:
with open(arquivo_origem, "r", encoding="utf-8") as f:
conteudo = f.read()
print("[OK] Arquivo lido como UTF-8")
except UnicodeDecodeError:
print("[WARN] Erro ao ler como UTF-8. Tentando latin1...")
with open(arquivo_origem, "r", encoding="latin1") as f:
conteudo = f.read()
print("[OK] Arquivo lido como latin1")
# Salvar convertido em UTF-8
with open(arquivo_destino, "w", encoding="utf-8") as f:
f.write(conteudo)
print(f"[OK] Arquivo convertido salvo em: {arquivo_destino}")
"C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\K3241.K03200Y0.D60110.EMPRECSV.utf8.csv"
Por fim, utilizamos um script em PYTHON para dividir o arquivo utf8 em 13 partes para importar para a tabela empresas0
import os
input_file = r"C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\K3241.K03200Y0.D60110.EMPRECSV.utf8.csv"
output_dir = r"C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\partes"
lines_per_file = 2000000 # 2 milhões de linhas por arquivo
os.makedirs(output_dir, exist_ok=True)
with open(input_file, 'r', encoding='utf-8', errors='ignore') as f:
header = f.readline() # lê cabeçalho
file_count = 0
line_count = 0
output_file = None
for line in f:
if line_count % lines_per_file == 0:
if output_file:
output_file.close()
output_path = os.path.join(output_dir, f'parte_{file_count}.csv')
output_file = open(output_path, 'w', encoding='utf-8', newline='')
output_file.write(header)
file_count += 1
output_file.write(line)
line_count += 1
if output_file:
output_file.close()
print(f"Divisão concluída! {file_count} arquivos criados.")
"C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\partes"
Depois importamos as 13 partes para a tabela empresas0 no MySQL:
Antes verificar local infile:
SHOW VARIABLES LIKE 'local_infile';
se necessário use: SET GLOBAL local_infile = 1;
depois podemos utilizar o comando:
LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/partes/parte_0.csv'
INTO TABLE empresas0
FIELDS TERMINATED BY ';'
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(cnpj_basico, razao_social, natureza_juridica, qualificacao_responsavel, @capital_social, porte_empresa, ente_federativo_responsavel)
SET capital_social = REPLACE(@capital_social, ',', '.');
-- Parte 1
LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/partes/parte_1.csv'
INTO TABLE empresas0
FIELDS TERMINATED BY ';'
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(cnpj_basico, razao_social, natureza_juridica, qualificacao_responsavel, @capital_social, porte_empresa, ente_federativo_responsavel)
SET capital_social = REPLACE(@capital_social, ',', '.');
-- Parte 2
LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/partes/parte_2.csv'
INTO TABLE empresas0
FIELDS TERMINATED BY ';'
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(cnpj_basico, razao_social, natureza_juridica, qualificacao_responsavel, @capital_social, porte_empresa, ente_federativo_responsavel)
SET capital_social = REPLACE(@capital_social, ',', '.');
-- Parte 3
LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/partes/parte_3.csv'
INTO TABLE empresas0
FIELDS TERMINATED BY ';'
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(cnpj_basico, razao_social, natureza_juridica, qualificacao_responsavel, @capital_social, porte_empresa, ente_federativo_responsavel)
SET capital_social = REPLACE(@capital_social, ',', '.');
-- Parte 4
LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/partes/parte_4.csv'
INTO TABLE empresas0
FIELDS TERMINATED BY ';'
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(cnpj_basico, razao_social, natureza_juridica, qualificacao_responsavel, @capital_social, porte_empresa, ente_federativo_responsavel)
SET capital_social = REPLACE(@capital_social, ',', '.');
-- Parte 5
LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/partes/parte_5.csv'
INTO TABLE empresas0
FIELDS TERMINATED BY ';'
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(cnpj_basico, razao_social, natureza_juridica, qualificacao_responsavel, @capital_social, porte_empresa, ente_federativo_responsavel)
SET capital_social = REPLACE(@capital_social, ',', '.');
-- Parte 6
LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/partes/parte_6.csv'
INTO TABLE empresas0
FIELDS TERMINATED BY ';'
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(cnpj_basico, razao_social, natureza_juridica, qualificacao_responsavel, @capital_social, porte_empresa, ente_federativo_responsavel)
SET capital_social = REPLACE(@capital_social, ',', '.');
-- Parte 7
LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/partes/parte_7.csv'
INTO TABLE empresas0
FIELDS TERMINATED BY ';'
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(cnpj_basico, razao_social, natureza_juridica, qualificacao_responsavel, @capital_social, porte_empresa, ente_federativo_responsavel)
SET capital_social = REPLACE(@capital_social, ',', '.');
-- Parte 8
LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/partes/parte_8.csv'
INTO TABLE empresas0
FIELDS TERMINATED BY ';'
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(cnpj_basico, razao_social, natureza_juridica, qualificacao_responsavel, @capital_social, porte_empresa, ente_federativo_responsavel)
SET capital_social = REPLACE(@capital_social, ',', '.');
-- Parte 9
LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/partes/parte_9.csv'
INTO TABLE empresas0
FIELDS TERMINATED BY ';'
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(cnpj_basico, razao_social, natureza_juridica, qualificacao_responsavel, @capital_social, porte_empresa, ente_federativo_responsavel)
SET capital_social = REPLACE(@capital_social, ',', '.');
-- Parte 10
LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/partes/parte_10.csv'
INTO TABLE empresas0
FIELDS TERMINATED BY ';'
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(cnpj_basico, razao_social, natureza_juridica, qualificacao_responsavel, @capital_social, porte_empresa, ente_federativo_responsavel)
SET capital_social = REPLACE(@capital_social, ',', '.');
-- Parte 11
LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/partes/parte_11.csv'
INTO TABLE empresas0
FIELDS TERMINATED BY ';'
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(cnpj_basico, razao_social, natureza_juridica, qualificacao_responsavel, @capital_social, porte_empresa, ente_federativo_responsavel)
SET capital_social = REPLACE(@capital_social, ',', '.');
-- Parte 12
LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/partes/parte_12.csv'
INTO TABLE empresas0
FIELDS TERMINATED BY ';'
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(cnpj_basico, razao_social, natureza_juridica, qualificacao_responsavel, @capital_social, porte_empresa, ente_federativo_responsavel)
SET capital_social = REPLACE(@capital_social, ',', '.');
depois podemos conferir a quantidade de linhas importadas com o seguinte comando:
SELECT COUNT(*) FROM empresas0;
Criando a tabela estabelecimentos0
CREATE TABLE estabelecimentos0 (
cnpj_basico VARCHAR(8),
cnpj_ordem VARCHAR(4),
cnpj_dv VARCHAR(2),
identificador_matriz_filial VARCHAR(1),
nome_fantasia VARCHAR(255),
situacao_cadastral VARCHAR(2),
data_situacao_cadastral DATE,
motivo_situacao_cadastral VARCHAR(2),
nome_cidade_exterior VARCHAR(255),
pais VARCHAR(3),
data_inicio_atividade DATE,
cnae_fiscal_principal VARCHAR(7),
cnae_fiscal_secundaria TEXT,
tipo_logradouro VARCHAR(50),
logradouro VARCHAR(255),
numero VARCHAR(10),
complemento VARCHAR(255),
bairro VARCHAR(100),
cep VARCHAR(8),
uf VARCHAR(2),
municipio VARCHAR(4),
ddd_1 VARCHAR(4),
telefone_1 VARCHAR(10),
ddd_2 VARCHAR(4),
telefone_2 VARCHAR(10),
ddd_fax VARCHAR(4),
fax VARCHAR(10),
correio_eletronico VARCHAR(255),
situacao_especial VARCHAR(255),
data_situacao_especial DATE
);
Utilizamos
um script PYTHON para colocar o arquivo no formato .tf8:
arquivo_origem = r"C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\estabelecimentos\K3241.K03200Y0.D51108.ESTABELE"
arquivo_destino = r"C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\estabelecimentos\K3241.K03200Y0.D51108.ESTABELE.utf8.csv"
def converter(encoding):
with open(arquivo_origem, "r", encoding=encoding, errors="strict") as origem, \
open(arquivo_destino, "w", encoding="utf-8") as destino:
for linha in origem:
destino.write(linha)
# tenta UTF-8 primeiro
try:
print("[INFO] Tentando UTF-8...")
converter("utf-8")
print("[OK] Convertido usando UTF-8")
except UnicodeDecodeError:
print("[WARN] UTF-8 falhou. Tentando latin1...")
converter("latin1")
print("[OK] Convertido usando latin1")
Por fim, utilizamos um script em PYTHON para dividir o arquivo utf8 em 13 partes (SE NECESSÁRIO)
import os
input_file = r"C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\estabelecimentos\K3241.K03200Y0.D51108.ESTABELE.utf8.csv"
# cria pasta "partes" dentro da pasta do arquivo
base_dir = os.path.dirname(input_file)
output_dir = os.path.join(base_dir, "partes")
lines_per_file = 2000000 # 2 milhões de linhas por arquivo
os.makedirs(output_dir, exist_ok=True)
with open(input_file, 'r', encoding='utf-8', errors='ignore') as f:
header = f.readline() # lê cabeçalho
file_count = 0
line_count = 0
output_file = None
for line in f:
if line_count % lines_per_file == 0:
if output_file:
output_file.close()
output_path = os.path.join(output_dir, f'parte_{file_count}.csv')
output_file = open(output_path, 'w', encoding='utf-8', newline='')
output_file.write(header)
file_count += 1
output_file.write(line)
line_count += 1
if output_file:
output_file.close()
print(f"Divisão concluída! {file_count} arquivos criados em: {output_dir}")
importando para o mysql:
LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/estabelecimentos/partes/parte_0.csv'
INTO TABLE estabelecimentos0
FIELDS TERMINATED BY ';'
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
(
cnpj_basico,
cnpj_ordem,
cnpj_dv,
identificador_matriz_filial,
nome_fantasia,
situacao_cadastral,
@data_situacao_cadastral,
motivo_situacao_cadastral,
nome_cidade_exterior,
pais,
@data_inicio_atividade,
cnae_fiscal_principal,
cnae_fiscal_secundaria,
tipo_logradouro,
logradouro,
numero,
complemento,
bairro,
cep,
uf,
municipio,
ddd_1,
telefone_1,
ddd_2,
telefone_2,
ddd_fax,
fax,
correio_eletronico,
situacao_especial,
@data_situacao_especial
)
SET
data_situacao_cadastral = STR_TO_DATE(@data_situacao_cadastral, '%Y%m%d'),
data_inicio_atividade = STR_TO_DATE(@data_inicio_atividade, '%Y%m%d'),
data_situacao_especial = STR_TO_DATE(@data_situacao_especial, '%Y%m%d');
Comentários
Postar um comentário