Importar arquivo CSV em tabela PostgreSQL

Neste tutorial, vamos importar um arquivo CSV, e fazer a inserção dos dados contidos no csv em uma tabela utilizando o banco de dados postgres.

Entendendo o arquivo csv

Para melhor entendimento do que será feito, vamos analisar as 5 primeiras linhas do arquivo. Isso vai servir para a gente gerar o modelo de dados (a tabela) correspondente ao arquivo.

Rank,Name,Platform,Year,Genre,Publisher,NA_Sales,EU_Sales,JP_Sales,Other_Sales,Global_Sales
1,Wii Sports,Wii,2006,Sports,Nintendo,41.49,29.02,3.77,8.46,82.74
2,Super Mario Bros.,NES,1985,Platform,Nintendo,29.08,3.58,6.81,0.77,40.24
3,Mario Kart Wii,Wii,2008,Racing,Nintendo,15.85,12.88,3.79,3.31,35.82
4,Wii Sports Resort,Wii,2009,Sports,Nintendo,15.75,11.01,3.28,2.96,33

Esse CSV é um conjunto de dados de venda de jogos de video game. Vamos então montar como seria uma tabela correspondente a este modelo de dados.

A primeira linha do CSV é o cabeçalho, a partir da segunda linha temos os dados que serão inseridos na tabela.

Uma entidade no modelo relacional que representa estes dados é a seguinte:

Um script SQL que representa esta estrutura é a seguinte:

CREATE TABLE videogamesale (
    id SERIAL PRIMARY KEY,
    rank INTEGER,
    name VARCHAR(150),
    platform VARCHAR(100),
    year VARCHAR(4),
    genre VARCHAR(100),
    publisher  VARCHAR(100),
    na_sales FLOAT,
    jp_sales FLOAT,
    eu_sales FLOAT,
    other_sales FLOAT,
    global_sales FLOAT
);

Importe um CSV para uma tabela usando o comando COPY

Para importar o csv com o comando copy, é só utilizar o seguinte comando:

\COPY videogamesale(rank, name, platform, year, genre, publisher, na_sales, jp_sales, eu_sales, other_sales, global_sales)
FROM '/caminho/para/csv/vgsales.csv'
DELIMITER ','
CSV HEADER;

Após importar o arquivo com sucesso, aparece a seguinte mensagem no console.

COPY 16598

Isso mostra que foi feito a importação do arquivo com sucesso, e que 16598 linha foram importadas.

Repare que no comando acima foi utilizando o caractere contra-barra (\), para executar o comando, se por acaso você utilizar o comando sem a contra-barra então ocorrerá a seguinte mensagem de erro:

ERROR:  could not open file "..." for reading: Permission denied
HINT:  COPY FROM instructs the PostgreSQL server process to read a file. You may want a client-side facility such as psql's \copy.

Foi utilizado o comando \copy , para mais informações veja a documentação.