Importação de arquivos CSV

 Neste post quero apresentar o recurso de importação de arquivos CSV para o banco de dados do SQL Server. A ideia aqui não é demonstrar o recurso de Importação e Exportação do SQL Server (que é muito intuitivo utilizar), mas demonstrar como fazer isso via script, utilizando código Transact-SQL (T-SQL).

Arquivos CSV é um padrão bem útil e antigo, utilizado para fornecer dados em formato flat, sem criptografia ou qualquer codificação de dados. Isto significa que você pode abri-lo no bloco de notas que vai conseguir ler os dados.

O próprio Excel abre o formato CSV sem convertê-lo para o formato atual XLSX. Com uma pequena formatação disponível no Excel é possível visualizar os dados em linhas x colunas na disposição de planilha e salvá-lo como tipo XLSX para usar os recursos do Excel.

Em alguns casos, especialmente com uso de um ERP, há a necessidade de importar este dados para o SQL Server em forma de uma nova tabela. Este formato pode ser utilizado para transferência de dados de uma base para outra, em geral, governados por diferentes ERPs.

De maneira bem simplificada, suponha que você tenha um cadastro de produtos em formato CSV (Import_Produtos.csv) com a seguinte formatação:

Figura 1 - Arquivo CSV a importar


O primeiro passo é criar um arquivo com extensão .FMT (Import_Produtos.fmt) contendo a seguinte formatação:

12.0
8
1     SQLCHAR     0     6      ";"       1     Produto                ""
2     SQLCHAR     0     50     ";"       2     Desc_Produto           SQL_Latin1_General_CP1_CI_AS
3     SQLCHAR     0     5      ";"       3     Cor                    ""
4     SQLCHAR     0     30     ";"       4     Desc_Cor               SQL_Latin1_General_CP1_CI_AS
5     SQLCHAR     0     50     ";"       6     Composicao_1           SQL_Latin1_General_CP1_CI_AS
6     SQLCHAR     0     10     ";"       5     Porcet_1               SQL_Latin1_General_CP1_CI_AS
7     SQLCHAR     0     50     ";"       8     Composicao_2           SQL_Latin1_General_CP1_CI_AS
8     SQLCHAR     0     10     "\r\n"    7     Porcet_2               SQL_Latin1_General_CP1_CI_AS

A explicação de cada tag de formatação é dada na figura 2:

Figura 2 - Formatação das colunas do arquivo CSV para importação

A primeira linha é a versão do arquivo: para o SQL Server 2014, especifique 12.0 ou menor. A partir do SQL Server 2017 a versão pode ser 13.0. A segunda linha é o número de colunas (n). Segue a sequência das "n" colunas. O tipo de dado não tem muitas opções: SQLCHAR, SQLNCHAR ou SQLBINARY. Existe também SQLFLT8 que é ponto flutuante, mas a conversão do dado não é nada intuitiva (o prefixo é apenas usado para este tipo, para tipo char coloque 0). Entre o prefixo e o tipo da coluna temos o tamanho da coluna. Depois vem o terminador de cada coluna (delimitador) sendo necessário especificar "\r\n" para o último campo ser identificado como tal. A posição da coluna durante a importação. Este é bem interessante, pois você pode mudar a disposição de visualização sem precisar mudar a disposição dentro do arquivo. Em seguida, o nome da coluna e por fim o collation. Este último especifica o mapa de caracteres usado em cada coluna. O collation geral é especificado na instalação do SQL Server (veja a especificação no nome deste exemplo: CI - Case Insensitive, AS - Ascendent). Se você não souber o collation, coloque "" que a importação assume o collation do banco de dados.

Finalmente, para importar os dados pelo Management Studio do SQL Server, desenvolva o seguinte código especificando o nome da pasta e do arquivo a ser importado:


-- 1) Somente visualização
SELECT
FROM OPENROWSET(BULK 'C:\Repositorio\ViaTransactSQL\Import_Produtos.CSV',
                FORMATFILE = 'C:\Repositorio\ViaTransactSQL\Import_Produtos.FMT',
                -- FORMAT = 'CSV',  -- Somente a partir do SQL Server 2017
FIRSTROW = 2) as P;

-- 2) Criação da tabela Swd_Import_CSV com os dados do BULK INSERT
SELECT
INTO Swd_Import_CSV
FROM OPENROWSET(BULK 'C:\Repositorio\ViaTransactSQL\Import_Produtos.CSV',
                FORMATFILE = 'C:\Repositorio\ViaTransactSQL\Import_Produtos.FMT',
                -- FORMAT = 'CSV',  -- Somente a partir do SQL Server 2017
FIRSTROW = 2) as P;

-- 3) Visualização da Swd_Import_CSV
SELECT * FROM Swd_Import_CSV


O primeiro select trará apenas a visualização do arquivo CSV pelo SGBD. O segundo fará a inserção dos dados do arquivo em uma tabela Swd_Import_CSV, já criando os campos conforme a formatação informada. O terceiro visualiza a tabela criada.


Observações:

A partir do SQL Server 2017 deve-se especificar o formato que está importando (FORMAT = 'CSV'), pois o SQL permite importar outros formatos como o PARQUET. Aqui utilizei o SQL Server 2014 e o uso da cláusula FORMAT causa erro de sintaxe.

Apesar do limite de tipos de dados, você pode criar campos float (SQLFLT8) ou binários (SQLBINARY), mas a visualização destes dados não será nada intuitiva. Meu conselho é que trabalhe tudo com o tipo SQLCHAR e após importar, use o CAST para gerar uma nova tabela com o tipo adequado (talvez você tenha que usar um REPLACE nos campos decimais para substituir a vírgula por um ponto e ficar no formato de casas decimais corretas na importação)


Referência:

https://learn.microsoft.com/pt-br/sql/t-sql/functions/openrowset-transact-sql?view=sql-server-ver16





Comentários

Postagens mais visitadas deste blog

Performance SQL Server - tempdb

Tabelas temporárias - Local x Global