Lists: | pgsql-pt-geral |
---|
From: | Douglas <douglas(dot)rauber(at)gmail(dot)com> |
---|---|
To: | pgsql-pt-geral(at)lists(dot)postgresql(dot)org |
Subject: | Importar arquivo com segmentos |
Date: | 2021-02-24 13:01:53 |
Message-ID: | CAOoRPSVXdeZzsR2FmEPmc_L9vU6ohZFgrh__WjPS-03JVN_jhQ@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-pt-geral |
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?
Muito obrigado!
Douglas
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:07:25 |
Message-ID: | CAFcNs+oMtV_u6ptA5mwHBOqeacf8gfC-v9Y=K8qgYnfEzCZpEw@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-pt-geral |
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.
Att,
[1] /docs/current/sql-copy.html
--
Fabrízio de Royes Mello Timbira - http://www.timbira.com.br/
PostgreSQL: Consultoria, Desenvolvimento, Suporte 24x7 e Treinamento
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 |
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: | 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 |
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
>