Translate

quinta-feira, 24 de outubro de 2013

PostgreSql - Importar arquivo csv e txt

Vamos supor que precisamos importar para a tabela "tb_esporte" os dados do arquivo "'C:/temp/arq_esporte.csv'". Conforme imagem a seguir:


Tabela: tb_esporte

Arquivo: arq_esporte.csv

Para importar o arquivo utilizamos o comando sql COPY e o arquivo deve estar armazenado no servidor do banco de dados. 
Caso você precise acessar remotamente um arquivo, ou seja, o arquivo está em uma outra máquina você deve utilizar o comando psql \copy. Acesse o link em:


COPY tb_esporte
(
    id,
    esporte_desc,
    disponibilidade
)
FROM 'C:/temp/arq_esporte.csv'
DELIMITER ';'
CSV HEADER;

Significado:
  • COPY: comando utilizado para importar a tabela;
  • tb_esporte: nome da tabela que receberá os dados;
  • (...):  dentro do parenteses colocamos as colunas que receberão os dados. Neste caso, utilizamos as colunas id, esporte_desc  e disponibilidade;
  • FROM: após o "FROM" devemos colocar o diretório que está localizado o arquivo. O diretório sempre deve usar "/", nunca "\", tanto para Windows quanto para LinuxO arquivo que será importado tem a extensão csv, também poderiamos importar um arquivo com a extensão "txt";
  • DELIMITER: após o delimiter devemos colocar o separador que o arquivo utiliza. O separador poder ser ";", ",", "|" entre outros. Neste caso,  o separador do arquivo é ";" ;
  • CSV HEADER: utilize "CSV HEADER" caso não queira importar a primeira linha. Para este arquivo não importamos a primeira linha, pois é o cabeçalho;

Para visualizar a tabela com os dados importados execute um select:

SELECT * FROM  tb_esportes;

Veja o resultado na imagem abaixo.


Possíveis problemas com a codificação

Se a codificação do arquivo for diferente do seu banco, pode ocorrer um erro e o seu arquivo não ser importado. Exemplo: se o seu arquivo tiver a codificação "ANSI" e o da sua tabela tiver a codificação "UTF-8". A mensagem de erro exibida será:

ERRO:  sequência de bytes é inválida para codificação "UTF8": 0xe7e36f

Para resolver este erro você poder salvar o arquivo com a codificação "UTF-8". No campo "tipo" escolha a codificação "UTF-8" e depois pressione o botão Salvar. Veja a imagem abaixo.






A versão do PostgreSql utilizada neste exemplo é a 9.0.

11 comentários:

  1. para importa a partir da linha 3 e parar na coluna 4? total de coluna no arquivo é 8!

    ResponderExcluir
    Respostas
    1. Este comentário foi removido pelo autor.

      Excluir
    2. Se seu arquivo tem 8 colunas e você quer importar da 1ª a 4ª coluna e a partir da 3ª linha você pode criar uma tabela temporária antes de importar para a tabela que você precisa (definitiva):

      Vamos chamar a tabela temporária de tb_tmp.
      Vamos chamar a tabela definitiva de tb_definitiva.

      Vamos chamar o arquivo de teste.csv:

      v1;v2;v3;v4;v5;v6;v7;v8
      87;24;48;10;20;11;87;10
      52;42;46;14;30;10;92;10
      95;50;42;24;40;21;37;10
      63;10;40;36;50;31;94;10
      42;14;38;40;60;41;27;10
      71;16;36;45;70;51;92;10
      59;18;34;57;80;61;57;10
      91;20;32;59;90;71;93;10
      85;22;30;62;10;81;17;10
      99;24;28;67;12;14;12;10

      1º) Vamos criar a tabela temporária com 9 colunas:
      *8 colunas para importar os dados do arquivo;
      *1 coluna para criar índice sequencial para as linhas (1, 2,3), que permitirá a localização das linhas (registros).

      O comando a seguir cria tabela temporária:

      CREATE TEMPORARY TABLE tb_tmp
      (
      indice SERIAL,
      c_1 INTEGER,
      c_2 INTEGER,
      c_3 INTEGER,
      c_4 INTEGER,
      c_5 INTEGER,
      c_6 INTEGER,
      c_7 INTEGER,
      c_8 INTEGER
      );

      2º) Vamos importar os dados do arquivo para a tabela temporária:

      COPY tb_tmp
      (
      c_1,
      c_2,
      c_3,
      c_4,
      c_5,
      c_6,
      c_7,
      c_8
      )
      FROM '/tmp/teste.csv'
      DELIMITER ';'
      CSV HEADER;

      3º) Após importamos os dados para a tabela "tb_tmp", podemos exibir os dados através do comando:

      SELECT * FROM tb_tmp

      indice | c_1 | c_2 | c_3 | c_4 | c_5 | c_6 | c_7 | c_8
      --------+-----+-----+-----+-----+-----+-----+-----+-----
      1 | 87 | 24 | 48 | 10 | 20 | 11 | 87 | 10
      2 | 52 | 42 | 46 | 14 | 30 | 10 | 92 | 10
      3 | 95 | 50 | 42 | 24 | 40 | 21 | 37 | 10
      4 | 63 | 10 | 40 | 36 | 50 | 31 | 94 | 10
      5 | 42 | 14 | 38 | 40 | 60 | 41 | 27 | 10
      6 | 71 | 16 | 36 | 45 | 70 | 51 | 92 | 10
      7 | 59 | 18 | 34 | 57 | 80 | 61 | 57 | 10
      8 | 91 | 20 | 32 | 59 | 90 | 71 | 93 | 10
      9 | 85 | 22 | 30 | 62 | 10 | 81 | 17 | 10
      10 | 99 | 24 | 28 | 67 | 12 | 14 | 12 | 10


      4º) Inserir os dados da tabela temporária "tb_tmp" na tabela definitiva "tb_definitiva"

      Vamos supor que a "tb_definitiva" possui a seguinte estrutura:

      CREATE TABLE tb_definitiva
      (
      d_1 INTEGER,
      d_2 INTEGER,
      d_3 INTEGER,
      d_4 INTEGER
      );

      Agora vamos utilizar o comando "INSERT SELECT" para inserir os dados que interessam na tabela "tb_definitiva", ou seja da 1ª a 4ª coluna a partir da terceira linha (índice maior ou igual a 3);

      INSERT INTO tb_definitiva (d_1, d_2, d_3, d_4)
      SELECT c_1, c_2, c_3, c_4 FROM tb_tmp
      WHERE INDICE >=3;

      5º) Após executar o comando "INSERT SELECT" veja como ficou a tabela "tb_definitiva":

      SELECT * FROM tb_definitiva;

      d_1 | d_2 | d_3 | d_4
      -----+-----+-----+-----
      95 | 50 | 42 | 24
      63 | 10 | 40 | 36
      42 | 14 | 38 | 40
      71 | 16 | 36 | 45
      59 | 18 | 34 | 57
      91 | 20 | 32 | 59
      85 | 22 | 30 | 62
      99 | 24 | 28 | 67

      Excluir
  2. Este comentário foi removido pelo autor.

    ResponderExcluir
  3. olá
    como eu faço para saber se o arquivo que eu vou importar, existe?

    ResponderExcluir
  4. olá
    como eu faço para saber se o arquivo que eu vou importar, existe?

    ResponderExcluir
  5. Como faço para inserir dados de um arquivo com formato (.tar) em uma tabela do postgresql ???

    ResponderExcluir
  6. como corrigir invalid input syntax for integer: "01"

    ResponderExcluir
  7. comando copy nao consegue encontrar o arquivo e da erro

    ResponderExcluir
  8. Tenho um arquivo txt e quero o importar para o postgres porem estou tendo dificuldade
    tenho o arquivo de layout dele exemplo:

    Coluna,Tamanho,Inicio,Fim,Tipo
    CO_PROCEDIMENTO,10,1,10,VARCHAR
    NO_PROCEDIMENTO,250,11,260,VARCHAR
    No arquivo de layout ele diz que essa coluna tem 10 caracteres do caracter 1 ao 10 e o tipo e varchar, assim como os demais campos.
    consegui criar as tabelas no postgree, porem não estou conseguindo importar o txt que não tem cabeçalho. Ex:
    0101010010ATIVIDADE EDUCATIVA / ORIENTAÇÃO EM GRUPO NA ATENÇÃO BÁSICA 1N9999999900009999999900000000000000000000000000000001 9999201908
    0101010028ATIVIDADE EDUCATIVA / ORIENTAÇÃO EM GRUPO NA ATENÇÃO ESPECIALIZADA 2I9999999900000084157100000000000000000270000000000006 9999201908
    0101010036PRÁTICA CORPORAL / ATIVIDADE FÍSICA EM GRUPO 1I9999999900000072157100000000000000000000000000000001 9999201908
    0101020015AÇÃO COLETIVA DE APLICAÇÃO TÓPICA DE FLÚOR GEL
    como faço para dar carga dessa tabela separando os caracteres?

    ResponderExcluir