Processar dados contidos em arquivo lido

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
victorgonc28
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Qui, 08 Fev 2018 5:11 pm

Boa noite,

Sou iniciante e estou fazendo um exercício, que foi proposto e tenho algumas dúvidas, tenho que ler arquivos de uma determinada pasta, processar os dados contidos nesses arquivos e depois salvar em um novo arquivo.
A parte de ler o arquivo e salvar já consegui fazer, estou com dúvidas em como processar os dados de cada linha do arquivo. Segue o exercício:

Desenvolva um sistema capaz de importar arquivos texto em lote. Nestes arquivos vão existir 3 tipos de
informações, conforme as estruturas abaixo:
1. Dados de Vendedores: (001;CPF;nome;salário)
2. Dados de Clientes: (002;CNPJ;nome;ramo de atividade)
3. Dados de Vendas: (003;ID da venda;ID do item;qtde do item;preço do item;Nome do Vendedor)
Exemplo:

Selecionar tudo

001;1234567891234;Diego;5000.00
002;2345675434544345;Jose da Silva;Rural
002;2345675433444345;Eduardo Gonsalvez Pereira;Rural
001;3245678865434;Renato;4000.00
003;10;11010;300;3403.30;Diego
003;08;13410;540;2400.10;Renato
Poderão ser submetidos vários arquivos para serem importados, o programa deve ler todos os arquivos
com extensão .dat que forem colocados no diretório /dados/in/
Após ler todos os dados o sistema deve criar um arquivo no diretório
/dados/out/${nomedoarquivolido}.dat.proc e dentro deste arquivo devem estar sumarizadas as seguintes
informações:
1. Quantidade de Clientes:
2. Quantidade de Vendedores:
3. ID da Venda de valor mais alto:
4. Nome do Vendedor que menos vendeu:
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Se tu já estás lendo e gravando, suponho que estejas já usando o UTL_FILE e saiba percorrer as linhas dos arquivos.
Teu problema seria identificar os tipo de linha e o identificar cada item de cada linha.
Pelo que entendi a primeira parte da linha identifica o tipo: 001-vendedor, 002-cliente ,003-venda.
Dessa forma dá para tratar cada linha de acordo com o tipo.
Agora como identificar as "colunas" da linha é necessário dividir pelos pontos e vírgulas.
Existe uma forma mais bruta e uma forma mais simples (se seu banco for 10+).
Forma bruta é tratar via funções INSTR e SUBSTR.
Forma fácil é com expressões regulares.

Veja essa consulta como dividir texto:

Selecionar tudo

WITH ARQUIVO AS (
select '001;1234567891234;Diego;5000.00' linha from dual union all
select '002;2345675434544345;Jose da Silva;Rural' linha from dual union all
select '002;2345675433444345;Eduardo Gonsalvez Pereira;Rural' linha from dual union all
select '001;3245678865434;Renato;4000.00' linha from dual union all
select '003;10;11010;300;3403.30;Diego' linha from dual union all
select '003;08;13410;540;2400.10;Renato' linha from dual
)
SELECT A.LINHA
     , INSTR(A.LINHA,';',1) POS1_CHAR -- POSIÇÃO DO PRIMEIRO ';'
     , SUBSTR(A.LINHA,1, INSTR(A.LINHA,';',1) - 1) PAR1_HARD /* PARTE 1 TRABALHOSA */
     , REGEXP_SUBSTR(A.LINHA,'[^;]+',1,1) PARTE1
     , REGEXP_SUBSTR(A.LINHA,'[^;]+',1,2) PARTE2
     , REGEXP_SUBSTR(A.LINHA,'[^;]+',1,3) PARTE3
     , REGEXP_SUBSTR(A.LINHA,'[^;]+',1,4) PARTE4
     , REGEXP_SUBSTR(A.LINHA,'[^;]+',1,5) PARTE5     
     , REGEXP_SUBSTR(A.LINHA,'[^;]+',1,6) PARTE6     
  FROM ARQUIVO A
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 3 visitantes