Re: Importar arquivo com segmentos

From: Douglas <douglas(dot)rauber(at)gmail(dot)com>
To: fabriziomello(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:37:08
Message-ID: CAOoRPSUJBbobtXk=d7bL1c+gjOT0cOJ6pzTbsB+apX0LrFyrtg@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-pt-geral

Beleza!

Top a sugestão, vou dar uma estudada no caso.

Muito obrigado

Em qua., 24 de fev. de 2021 às 10:28, Fabrízio de Royes Mello <
fabriziomello(at)gmail(dot)com> escreveu:

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

Browse pgsql-pt-geral by date

  From Date Subject
Next Message Ranier Vilela 2021-03-31 20:56:57 UPDATE COM SELECT
Previous Message Fabrízio de Royes Mello 2021-02-24 13:28:27 Re: Importar arquivo com segmentos