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
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 |