leitura de arquivo txt

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
amarorafael
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 44
Registrado em: Qua, 14 Mar 2012 2:37 pm

bom dia,
tenho um arquivo no servidor com 2 linhas (montei apenas para teste).
o arquivo é do tipo csv e o mesmo contém 6 campos separados por ";"
eu criei uma rotina pra "quebrar" esses campos e armazenar numa variável do tipo TYPE.
porém eu só consigo fazer essa quebra em apenas uma linha do arquivo. A segunda linha se repete.
alguém já fez alguma rotina parecida?!
segue o código que eu fiz.

Selecionar tudo

DECLARE 
  l_uFile              utl_file.file_type;  --> Identificador do Arquivo
  l_vFile_Name         VARCHAR2(100);       --> Nome do arquivo a ser lido
  l_vFile_Path         VARCHAR2(100);       --> Caminho do arquivo
  l_vBuffer            VARCHAR2(32767);     --> variável reponsável por receber os dados do arquivo
  --
  TYPE type_tab IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER;
  v_type_tab           type_tab;
  v_string_aux         VARCHAR2(100);
  v_pos                NUMBER := 1;
  v_indx               NUMBER := 1;
BEGIN
  l_vFile_Name := 'teste.csv';
  l_vFile_Path := 'ODPDIR';
  --
  --> abrindo arquivo para leitura
  --
  l_uFile := utl_file.fopen(l_vFile_Path, l_vFile_Name, 'R');
  LOOP 
    utl_file.get_line(l_uFile, l_vBuffer);
    --
  /*  IF substr(l_vBuffer,length(l_vBuffer) - 1,1) != ';' THEN
      l_vBuffer := l_vBuffer|| ';';                         
    END IF;
 */   --
    FOR i IN 1.. length(l_vBuffer) LOOP
      v_string_aux := SUBSTR(l_vBuffer,v_pos,((INSTR(l_vBuffer,';',1,v_indx)) - v_pos));
      v_pos        := INSTR(l_vBuffer,';',1,v_indx) + 1;
      --
      v_type_tab(v_indx) := v_string_aux;
      v_indx := v_indx + 1;
    END LOOP;
    --
    IF v_type_tab.COUNT > 0 THEN
      FOR r_vet IN v_type_tab.FIRST..v_type_tab.LAST LOOP
         dbms_output.put_line(v_type_tab(r_vet));
      END LOOP;
    END IF;
  --
  END LOOP;
  --
  UTL_FILE.fclose(l_uFile);
  --
END;
segue a saída
36968
AF.CONECTI
4523
-23502,86
1
36968 ---> os dados da primeira linha se repetem
AF.CONECTI
4523
-23502,86
1
amarorafael
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 44
Registrado em: Qua, 14 Mar 2012 2:37 pm

bom galera achei o problema !
tava em uma variável de controle do índice do loop que eu não estava inicializando após percorrer o loop.
segue o código corrigido

Selecionar tudo

DECLARE 
  l_uFile              utl_file.file_type;  --> Identificador do Arquivo
  l_vFile_Name         VARCHAR2(100);       --> Nome do arquivo a ser lido
  l_vFile_Path         VARCHAR2(100);       --> Caminho do arquivo
  l_vBuffer            VARCHAR2(32767);     --> variável reponsável por receber os dados do arquivo
  l_nCont              NUMBER := 0;
  --
  TYPE type_tab IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER;
  l_tType_tab           type_tab; 
  l_vString_aux         VARCHAR2(100);
  l_nPos                NUMBER := 0;
  l_nIndx               NUMBER := 1;
  l_vAux               VARCHAR2(32767);
BEGIN
  l_vFile_Name := 'teste.csv';
  l_vFile_Path := 'ODPDIR';
  --
  --> abrindo arquivo para leitura 
  --
  l_uFile := utl_file.fopen(l_vFile_Path, l_vFile_Name, 'R');
  --
  BEGIN       
    LOOP 
      utl_file.get_line(l_uFile, l_vBuffer);
      --
      l_vAux := trim(chr(13) FROM substr(l_vBuffer,1));
      IF substr(l_vAux, length(l_vAux) - 1,1) != ';' THEN
        l_vAux := l_vAux|| ';';
      END IF;
      --
      FOR i IN 1.. length(l_vAux) LOOP
        l_vString_aux        := SUBSTR(l_vAux,l_nPos,((INSTR(l_vAux,';',1,l_nIndx)) - l_nPos));
        l_nPos               := INSTR(l_vBuffer,';',1,l_nIndx) + 1;
        l_tType_tab(l_nIndx) := l_vString_aux;
        l_nIndx              := l_nIndx + 1;
        l_nCont              := l_nCont + 1;  
      END LOOP;
      -- 
      l_nIndx := 1;  -- parte que estava faltando
      --
      IF l_tType_tab.COUNT > 0 THEN
        FOR r_vet IN l_tType_tab.first..l_tType_tab.last LOOP
          dbms_output.put_line(l_tType_tab(r_vet));
        END LOOP;
      END IF;
      --
    END LOOP;
  EXCEPTION
    WHEN OTHERS THEN
      UTL_FILE.fclose(l_uFile);
  END;
END;
Responder
  • Informação
  • Quem está online

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