Re: Importar arquivo com segmentos

From: Fabrízio de Royes Mello <fabriziomello(at)gmail(dot)com>
To: Douglas <douglas(dot)rauber(at)gmail(dot)com>
Cc: pgsql-pt-geral(at)lists(dot)postgresql(dot)org
Subject: Re: Importar arquivo com segmentos
Date: 2021-02-24 13:28:27
Message-ID: CAFcNs+q3FDRRQ3X8ZR_qmB4JwO_UJmiystPXf7bZdXGW_bc09Q@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-pt-geral

On Wed, Feb 24, 2021 at 10:07 AM Fabrízio de Royes Mello <
fabriziomello(at)gmail(dot)com> wrote:

>
> On Wed, Feb 24, 2021 at 10:02 AM Douglas <douglas(dot)rauber(at)gmail(dot)com> wrote:
>
>> Bom dia!
>>
>> Alguém pode dar uma dica de como importar um arquivo pro postgresql com
>> "segmentos" no *mesmo arquivo*?
>> Vou exemplificar.
>> tenho um arquivo com tres tipos de registros com tamanho fixo, por
>> exempolo:
>>
>> Registro do tipo Pessoa
>> tipo_registro, inteiro, 1 dígito, fixo 1 (pode ser 1-PESSOA, 2-ENDERECO,
>> 3-TELEFONE)
>> id, inteiro, 7
>> nome, texto, 50
>>
>> Registro do tipo Endereco
>> tipo_registro, inteiro, 1 dígito, fixo 2 (pode ser 1-PESSOA, 2-ENDERECO,
>> 3-TELEFONE)
>> id_pessoa, inteiro, 7
>> rua, texto, 50
>> cidade, texto, 50
>> uf, texto, 2
>>
>> Registro do tipo Telefone
>> tipo_registro, inteiro, 1 dígito, fixo 3 (pode ser 1-PESSOA, 2-ENDERECO,
>> 3-TELEFONE)
>> id_pessoa, inteiro, 7
>> numero, texto, 10
>> descricao, texto, 50
>>
>> Eu tenho um arquivo de 1GB com esse tipo de informação (aqui
>> simplificada).
>> Eu preciso importar esse arquivo pra 3 tabelas distintas (pessoas,
>> enderecos e telefones), cada uma com seu conjunto de informações. Há como
>> fazer isso diretamente pro banco ou preciso escrever um programa pra
>> realizar essa importação?
>>
>>
> Diretamente sem "trabalhar" o arquivo antes é um pouco complicado...
> existe o comando COPY [1] que pode te auxiliar mas não funciona com tamanho
> fixo, ele precisa de delimitadores... se vc conseguir transformar esse seu
> arquivo em CSV fazendo split em 3 arquivos distintos dai é bem simples de
> usar esse comando.
>
>
Testando aqui tem como usar a cláusula PROGRAM do COPY e com um pouco de
"grep" e "awk" dá pra fazer o que vc precisa:

fabrizio=# \! cat /tmp/file.txt
10000001FULANO DE TAL
20000001RUA XYZ CIDADE
UF
300000019999999999TELEFONE1

fabrizio=# CREATE TABLE pessoa(id INTEGER, nome VARCHAR(50));
CREATE TABLE

fabrizio=# COPY pessoa FROM PROGRAM $$grep -E '^1' /tmp/file.txt | awk -v
FIELDWIDTHS="1 7 50" -v OFS=, '{print $2,$3}'$$ WITH (FORMAT CSV);
COPY 1

fabrizio=# SELECT * FROM pessoa;
id | nome
----+---------------
1 | FULANO DE TAL
(1 row)

Mas na minha opinião seria melhor gerar 3 arquivos baseados naquele "grep |
awk" separados e importar individualmente.

Att,

--
Fabrízio de Royes Mello Timbira - http://www.timbira.com.br/
PostgreSQL: Consultoria, Desenvolvimento, Suporte 24x7 e Treinamento

In response to

Responses

Browse pgsql-pt-geral by date

  From Date Subject
Next Message Douglas 2021-02-24 13:37:08 Re: Importar arquivo com segmentos
Previous Message Fabrízio de Royes Mello 2021-02-24 13:07:25 Re: Importar arquivo com segmentos