MySQL - Gerando arquivos .csv com cabeçalho e acentuação diretamente de uma query no banco de dados

Já tratamos anteriormente de como gerar um arquivo a partir de uma consulta no MySQL porém não falamos especificamente de arquivos .CSV (aqueles separados por ponto e vírgula e que são reconhecidos diretamente pelos editores de planilha)

Além disso não tratamos também de como inserir um cabeçalho com os nomes dos campos e nem como esta saída ser gerada diretamente com acentuação, importante para nós que trabalhamos com o português.

Vamos começar com nosso exemplo padrão

Para DOS
 SELECT * INTO OUTFILE 'C:/diretorio/arquivo.txt' FROM tabela  

Para Linux
 SELECT * INTO OUTFILE '/diretorio/arquivo.txt' FROM tabela  

As queries acima geram arquivos com acentuação no padrão UTF8, fora do padrão .csv e sem cabeçalho.

Vamos transformar as queries acima para que a saída esteja no padrão .csv

 SELECT * FROM tabela  
 INTO OUTFILE 'C:/diretorio/arquivo.csv'  
 FIELDS ENCLOSED BY '"' TERMINATED BY ';' ESCAPED BY '"'  
 LINES TERMINATED BY '\r\n';  

'Fields enclosed by' define qual caractere envolverá os dados dos campos, 'Terminated by' define em que ponto um campo termina e outro começa e 'Lines terminated by' define o caractere que informa o final de uma linha.

Porém a acentuação neste caso não será exibida da forma que desejamos, pois a codificação vem como UTF8. Para acertar este detalhe vamos modificar novamente nossa querie.

 SELECT * FROM tabela  
 INTO OUTFILE 'C:/diretorio/arquivo.csv'  
 CHARACTER SET latin1  
 FIELDS ENCLOSED BY '"' TERMINATED BY ';' ESCAPED BY '"'  
 LINES TERMINATED BY '\r\n';  

'Character Set latin1' gera o arquivo com acentuação no formato correto.

Agora falta colocarmos um cabeçalho no arquivo de saída com os nomes dos campos.

 SELECT 'campo1','campo2','campoN'   
 UNION ALL   
 SELECT campo1,campo2,campoN FROM tabela   
 INTO OUTFILE 'C:/diretorio/arquivo.csv'  
 CHARACTER SET latin1  
 FIELDS ENCLOSED BY '"' TERMINATED BY ';' ESCAPED BY '"'  
 LINES TERMINATED BY '\r\n';  

SELECT 'campo1','campo2','campoN' cria uma saída 'fake' em texto com os nomes dos campos. Union All junta esta saída à próxima que é a nossa SELECT campo1, campo2, campoN FROM tabela.

Apenas lembrando que ao juntar duas queries com UNION as quantidades de campos devem coincidir.
Caso uma querie tenha mais campos que a outra o MySQL retorna erro.

Por hoje é isso

Comentários

Postar um comentário

Postagens mais visitadas deste blog

PHP - Utilizando proxy e CURL para acessar servidores ou sites

MySQL - Cálculo de período de tempo entre duas datas com TIMESTAMPDIFF

MySQL - Completando quantidades fixas de caracteres com as funções LPAD() e RPAD()