Como importar arquivo CSV no SQL Server
Neste tutorial mostro como importar um arquivo no formato CSV para uma tabela de um banco de dados SQL Server, de modo a realizar a inserção de múltiplos registros de uma só vez, por meio de uma operação INSERT INTO.
Para tal vamos usar dois arquivos: o arquivo CSV propriamente dito, contendo os dados a serem inseridos na tabela, e um arquivo especificador de formatos para ajustar os dados do arquivo CSV com as colunas específicas da tabela, além é claro do código SQL que executará a tarefa de inserção dos registros em bulk (vários de uma vez).
O que é um arquivo CSV?
Um arquivo CSV (Comma-Separated Values / Valores Separados por Vírgulas) é um tipo de arquivo de texto simples que armazena dados tabulares de forma estruturada, empregado com frequência para importar e exportar dados entre diferentes programas, sistemas e plataformas.
Neste tipo de arquivo, cada linha representa uma entrada de dados (um registro) e cada campo (coluna) é separado por um caractere delimitador, geralmente uma vírgula (“,”), ponto e vírgula (“;”) ou tabulação (“tab”). O mais comum é usar a vírgula, daí o nome do formato.
Cada linha no arquivo representa um registro e os campos podem conter texto, números, datas ou outros tipos de dados quaisquer. Usamos arquivos csv em aplicativos de planilhas, bancos de dados, programas para análise de dados e diversas outras aplicações, pois são bastante simples e fáceis de manipular.
Vamos usar neste tutorial um arquivo CSV de nome Livros.csv, que conterá dados a serem inseridos em uma tabela de nome Livro, e com ele vamos cadastrar vários registros de forma rápida e simples.
Arquivo CSV de exemplo: Livros.csv
A seguir temos o conteúdo do arquivo a ser usado no exemplo de inserção de linhas na tabela. Neste arquivo, a primeira linha é uma linha de cabeçalho, contendo os nomes das colunas da tabela que receberá os dados (tabela de nome Livro), separados por vírgulas. Você deve alterar o conteúdo desse arquivo de acordo com a tabela do banco que está usando, seguindo as instruções na sequência.
As linhas subsequentes contém os dados em si, sendo que cada linha do arquivo corresponde a uma linha a ser inserida na tabela (um registro), também separadas por vírgulas, seguindo a mesma ordem das colunas descritas no cabeçalho:
NomeLivro,ISBN13,DataPub,PreçoLivro,NumeroPaginas,IdEditora,IdAssunto 2001 - Um Odisséia no Espaço,9788576571551,20200930,55.86,336,3,1 Fahrenheit 451,9788525052247,20120601,43.56,216,3,1 Admirável mundo novo,9788525056009,20140101,50.32,312,3,1 1984,9788535914849,20090721,29.67,416,14,1 A volta ao mundo em 80 dias,9788537816134,18730101,59.41,256,11,5 O Nome da Rosa,9788501115829,20191216,51.99,592,18,5 Memórias Póstumas de Brás Cubas,9788525433131,18810101,34.90,240,14,6 O Evangelho Segundo Jesus Cristo,9788535905595,19910101,49.90,512,14,6 Cidades Invisíveis,9788535907445,19720101,42.80,176,14,6 Windows Server 2016: Installing & Configuring,9781535074094,20160712,432.00,436,4,11 Ensaio Sobre a Cegueira,9788571645118,19950101,39.90,312,14,6 Ulisses,9780141184432,19220202,78.90,450,16,6 Practical Electronics for Inventors,9781259587542,20160711,212.58,1056,9,3 Eu Robô,9788576571667,19501202,35.00,300,3,1 Dom Casmurro,9788525404186,19000101,19.90,256,14,6
Insira esse conteúdo em um arquivo de texto simples vazio, como um arquivo do bloco de notas no Windows, e salve com o nome de Livros.csv. Caso queira, acrescente mais livros à listagem. Não é necessário usar aspas para delimitar os dados do tipo VARCHAR ou DATE.
Obs.: Tome cuidado ao salvar o arquivo para não salvá-lo com a extensão .txt!!! Para evitar esse problema, selecione “Todos os arquivos” em “Tipo” na caixa de diálogo Salvar, e certifique-se de usar a codificação UTF-8, como segue:
A seguir criaremos o arquivo de formato XML a ser usado com esse csv.
Arquivo de Formato XML
Um arquivo de formato é um arquivo do tipo XML (eXtensible Markup Language) que descreve a estrutura dos dados contidos no arquivo CSV, especificando como os campos são delimitados, o comprimento máximo de cada campo e como esses campos são mapeados para as colunas da tabela do banco de dados durante o processo de importação de dados em massa..
O arquivo que usaremos possui o nome formato.xml. Crie-o com um editor de textos, usando o conteúdo a seguir, e salve-o no mesmo diretório do arquivo Livros.CSV:
<?xml version="1.0" encoding="UTF-8"?> <BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <RECORD> <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="100"/> <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="13"/> <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="8"/> <FIELD ID="4" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="19"/> <FIELD ID="5" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="10"/> <FIELD ID="6" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="5"/> <FIELD ID="7" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="5"/> </RECORD> <ROW> <COLUMN SOURCE="1" NAME="NomeLivro" xsi:type="SQLVARYCHAR"/> <COLUMN SOURCE="2" NAME="ISBN13" xsi:type="SQLVARYCHAR"/> <COLUMN SOURCE="3" NAME="DataPub" xsi:type="SQLDATE"/> <COLUMN SOURCE="4" NAME="PrecoLivro" xsi:type="SQLMONEY"/> <COLUMN SOURCE="5" NAME="NumeroPaginas" xsi:type="SQLSMALLINT"/> <COLUMN SOURCE="6" NAME="IdEditora" xsi:type="SQLSMALLINT"/> <COLUMN SOURCE="7" NAME="IdAssunto" xsi:type="SQLTINYINT"/> </ROW> </BCPFORMAT>
O funcionamento deste arquivo é o seguinte:
- <BCPFORMAT>: Elemento raiz do arquivo XML que define o formato do arquivo de dados.
- <RECORD>: Define a estrutura de cada registro (linha) no arquivo CSV.
- <FIELD>: Define os campos (colunas) do registro. Cada tag <FIELD> especifica o identificador do campo (ID), o tipo de terminador que separa os campos (TERMINATOR), e o comprimento máximo (MAX_LENGTH) do campo.
- <ROW>: Define a correspondência entre os campos do arquivo CSV e as colunas da tabela do banco de dados.
- <COLUMN>: Especifica como cada campo do arquivo CSV (SOURCE) é mapeado para uma coluna na tabela do banco de dados (NAME). Além disso, define o tipo de dados da coluna (xsi:type), que pode ser:
- SQLVARYCHAR para strings
- SQLDATE para datas
- SQLMONEY para valores monetários
- SQLSMALLINT para números inteiros pequenos
- SQLTINYINT para números inteiros muito pequenos.
Código SQL
E a seguir temos o código SQL que deverá ser executado no SQL Server, por exemplo usando o SSMS (SQL Server Management Studio):
INSERT INTO Livro (NomeLivro, ISBN13, DataPub, PrecoLivro, NumeroPaginas, IdEditora, IdAssunto) SELECT NomeLivro, ISBN13, DataPub, PrecoLivro, NumeroPaginas, IdEditora, IdAssunto FROM OPENROWSET( BULK 'C:\SQL\Livros.CSV', FORMATFILE = 'C:\SQL\Formato.xml', CODEPAGE = '65001', -- UTF-8 FIRSTROW = 2 ) AS LivrosCSV;
1. A linha “INSERT INTO Livro (NomeLivro, ISBN13, DataPub, PrecoLivro, NumeroPaginas, IdEditora, IdAssunto)” é a declaração SQL usada para inserir os dados na tabela Livro. Serão preenchidos os campos NomeLivro, ISBN13, DataPub, PrecoLivro, NumeroPaginas, IdEditora e IdAssunto.
2. O comando “SELECT NomeLivro, ISBN13, DataPub, PrecoLivro, NumeroPaginas, IdEditora, IdAssunto” determina quais colunas do arquivo CSV serão selecionadas para inserção na tabela de livros.
3. “FROM OPENROWSET(BULK ‘C:\SQL\Livros.CSV’, FORMATFILE = ‘C:\SQL\Formato.xml’, CODEPAGE = ‘65001’, FIRSTROW = 2)“: Aqui, estamos usando a função OPENROWSET para abrir e ler o arquivo CSV especificado. Os parâmetros desta função são:
- BULK ‘C:\SQL\Livros.CSV’: Indica o caminho do arquivo CSV que será lido (no caso o arquivo está na pasta SQL dentro da raiz do sistema).
- FORMATFILE = ‘C:\SQL\Formato.xml‘: Especifica o arquivo de formato XML que descreve a estrutura do arquivo CSV. Este arquivo de formato é utilizado para especificar detalhes sobre o layout do arquivo CSV, como a ordem das colunas e o delimitador utilizado.
- CODEPAGE = ‘65001’: Define a codificação de caracteres a ser usada durante a leitura do arquivo CSV. Neste caso, o valor 65001 representa a codificação UTF-8.
- FIRSTROW = 2: Indica que a leitura do arquivo CSV começará a partir da segunda linha, de modo a ignorar o cabeçalho do arquivo CSV (que é a primeira linha).
4. AS LivrosCSV;: Define um alias (nome de correlação) para os dados extraídos do arquivo CSV, permitindo que esses dados sejam referenciados dentro da consulta como se fossem uma tabela temporária chamada LivrosCSV. É um parâmetro obrigatório aqui.
Execute o comando acima no SQL Server, e, se nenhum erro for retornado, verifique a inserção dos registros com um SELECT simples:
SELECT * FROM Livro;
Conclusão
Inserir alguns poucos registros em uma tabela de banco de dados é uma tarefa simples e rápida. Porém, cadastrar muitos registros – centenas, milhares ou até mesmo milhões – pode se tornar extremamente trabalhoso e demorado, e neste caso podemos recorrer à importação em massa dos dados. Neste tutorial vimos uma forma simples de fazer isso no SQL Server: usando arquivos de texto do tipo CSV.
Nos próximos tutoriais veremos outras formas de importação (e também exportação) de dados em bancos de dados.
Prefere assistir a uma aula? Então assista ao vídeo da Bóson Treinamentos no YouTube sobre Arquivos CSV no MySQL:
Colabore com a Bóson Treinamentos
Ajude o canal adquirindo meus cursos na Udemy:
- Bancos de Dados com MySQL Básico: https://bit.ly/35QdWE4
- Lógica de Programação com Português Estruturado: https://bit.ly/3QKPn22
- Programação em Python do Zero: https://bit.ly/python-boson
Adquira também livros e outros itens na loja da Bóson Treinamentos na Amazon e ajude o canal a se manter e crescer: https://www.amazon.com.br/shop/bosontreinamentos