Gerar arquivo texto sem quebra de linha (utl_file)

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
oteles
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Ter, 06 Mai 2008 3:41 pm
Localização: Vitoria-ES

É meu primeiro post e espero que alguém possa me ajudar.

Estou fazendo uma procedure para ler arquivos com extensão .htm e dar saída em um arquivo txt.

Ocorre que os arquivos de origem tem <enter> (Dec: 13 Hex: 0D AscII: CR (carriage return) key: ctrl M) no final da linha, como no exemplo:

Prédio Com. V.Velha 1ª Locação^m
Lojão 240 m2 + Salão 180 m2 Pronto^m
p/ Split Exc. Imóvel Prox Móveis^m
R67577^m

Preciso exportar esse conteúdo para um arquivo txt, como uma tripa, ou seja sem quebra de linha,
Prédio Com. V.Velha 1ª Locação Lojão 240 m2 + Salão 180 m2 Pronto p/ Split Exc. Imóvel Prox Móveis R67577

Desde já agradeço a ajuda.

Sds,

Segue código para análise.

Selecionar tudo

CREATE OR REPLACE PROCEDURE         "LETEXTO"  (PARAMETRO VARCHAR2) --Data no Formato yyyymmdd
IS
     texto VARCHAR2(1024);          -- cada linha de dados

     arqin sys.utl_file.file_type;   -- handle para o arquivo de entrada

     arqout sys.utl_file.file_type;  -- handle para o arquivo de saída

	 arqlog sys.utl_file.file_type;  -- handle para o arquivo de LOG

     HOJE   VARCHAR2(20);

	 ARQUIVO VARCHAR2(1024);

	 DIRETORIO VARCHAR2(1024);

	 ARQ VARCHAR2(1024);

	 DIR VARCHAR2(1024);

	 TAMANHO VARCHAR2(1024);

   CURSOR LISTA IS SELECT DISTINCT
        LENGTH(C.FILENAME),C.FILENAME,C.FILENAME
	  FROM
	 	 PUB P, CLPRO C, AD A
	  WHERE
	 	   P.ADNO=C.ADNO AND
		   A.ADNO=P.ADNO AND
		   P.VNOFLAG='Y' AND
		   C.VNOFLAG='Y' AND
		   A.VNOFLAG='Y' AND
		 --  TO_CHAR(TRUNC(P.PDATE),'dd/mm/yyyy') = HOJE AND
		   P.ADRNO <> 31011 AND
		   P.STATE='VAR' AND
		   A.PRODTYPE='CO' AND
		   P.CLASS<>'99' AND
		   P.ADNO IN (4563051,4565219,4565220,4565221,4565222,4565223,4565225);
BEGIN

	arqlog := sys.utl_file.fopen('/u02/ads/LOGIMPORT', 'LOG.TXT', 'w');
    sys.UTL_FILE.PUT_LINE(arqlog, '** Problema ao gerar arquivo easyclass.txt **');
 	arqout := sys.utl_file.fopen('/u02/ads/LOGIMPORT', 'EXPORTA.TXT', 'w');

   -- Data recebida como parametro
    IF PARAMETRO='DEFAULT' THEN
      SELECT TO_CHAR(SYSDATE-1,'dd/mm/yyyy') INTO HOJE FROM DUAL;
    ELSE
      HOJE:=parametro;
    END IF;

	 OPEN LISTA;
     LOOP

	     /* Devolve cada linha do resultado da consulta acima
            em variáveis PL/SQL: */
         FETCH LISTA INTO TAMANHO,DIRETORIO,ARQUIVO;
         /* Se não houver mais linhas para buscar, sai do laço: */
		 EXIT WHEN LISTA%NOTFOUND;

		 IF TAMANHO = '13' THEN
			DIR := '/u02/ads/'||SUBSTR(DIRETORIO, 1 , 1);
		    ARQ := SUBSTR(ARQUIVO, 3 , 7)|| '.HTM';
		 ELSE
			DIR := '/u02/ads/'||SUBSTR(DIRETORIO, 1 , 2);
		 	ARQ := SUBSTR(ARQUIVO, 4 , 7)|| '.HTM';

	     END IF;

      	 arqin :=  sys.utl_file.fopen (DIR, ARQ, 'r');

		 LOOP
           BEGIN
		           sys.utl_file.get_line(arqin, texto);
		           sys.utl_file.put_line(arqout, texto);
           EXCEPTION
               WHEN NO_DATA_FOUND THEN
			   EXIT;
           END;
 		 END LOOP;
	
		 sys.UTL_FILE.FCLOSE(arqin);

  	 END LOOP;
     CLOSE LISTA;

  --fechando os arquivos abertos

sys.utl_file.fclose(arqin);

sys.utl_file.fclose(arqout);

EXCEPTION
		 WHEN UTL_FILE.INVALID_PATH THEN
		 		 DBMS_OUTPUT.PUT_LINE('Caminho invalido.');
		 		 UTL_FILE.FCLOSE(ARQLOG);
		 WHEN UTL_FILE.READ_ERROR THEN
		 		 DBMS_OUTPUT.PUT_LINE('Erro durante a leitura.');
		 		 UTL_FILE.FCLOSE(ARQLOG);
		 WHEN UTL_FILE.WRITE_ERROR THEN
		 		 DBMS_OUTPUT.PUT_LINE('Erro durante a escrita.');
		 		 UTL_FILE.FCLOSE(ARQLOG);
		 WHEN OTHERS THEN
		 		 DBMS_OUTPUT.PUT_LINE('Erro!!');
		 		 UTL_FILE.FCLOSE(ARQLOG);

END;
/
Julian Campagnoli
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 82
Registrado em: Ter, 26 Fev 2008 11:33 am
Localização: MG e SP
Julian de A. Campagnoli
Treinee, Desenvolvedor Oracle PL-SQL

Brother beleza ?????

Não testei seu codigo ... mas conforme você pergutou

você pode tentar assim:

Selecionar tudo

declare uma variavel 
   LINHA   VARCHAR2; -- para agir como um buffer
Se as ocorrencias for sempre de 4 em 4 linhas conforme seu exemplo:

Selecionar tudo

     Prédio Com. V.Velha 1ª Locação^m 
      Lojão 240 m2 + Salão 180 m2 Pronto^m 
      p/ Split Exc. Imóvel Prox Móveis^m 
      R67577^m 

UTL_FILE.FOPEN() ....
LOOP
   UTL_FILE.GET_LINE() ... ;
        LINHA := LINHA || arqin;

END LOOP; 
Obs.: você deverá controlar com um flag(variavel) as quebras de linhas e depois quando for iniciar uma nova linha. Limpe a variavel LINHA para que lea possa receber novos valores.

Qualquer coisa manda ai.

Abraço
rodfbar
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 241
Registrado em: Ter, 09 Out 2007 11:15 am
Localização: Batatais - SP

tenta ai invez de usar o put_line (sys.utl_file.put_line(arqout, texto))
usar apenas o put(sys.utl_file.put(arqout, texto))


abrçs
oteles
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Ter, 06 Mai 2008 3:41 pm
Localização: Vitoria-ES

Vamos lá....

Julian, ainda estou testando sua solução, manipulando as linhas em variáveis.

Quanto a solução do rodfbar há erro ao executar a linha sugerida --> put(sys.utl_file.put(arqout, texto))

Erro: PLS-00222: no function with name 'PUT' exists in this scope

Continuando na busca pelo sucesso...

Abçs a todos e obrigado pela ajuda.

Valeu :)
rodfbar
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 241
Registrado em: Ter, 09 Out 2007 11:15 am
Localização: Batatais - SP

não...

coloca só assim

Selecionar tudo

sys.utl_file.put(arqout, texto)
o "put(" eu coloquei só pra citar a troca de comando desculpa...

abçs
oteles
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Ter, 06 Mai 2008 3:41 pm
Localização: Vitoria-ES

Putz! Esse fórum é bom mesmo. Obrigado Rodfbar

Deu certo sua sugestão, mas também estava trabalhando com variáveis e também consegui o que estava querendo. Postei para que outros possam usufruir de nossas soluções.

Comunidade é isso!!

Abçs,

Selecionar tudo

		 texto := '';

 		 LOOP
		 	 BEGIN
			 	  sys.utl_file.get_line(arqin, texto2);
                                  texto2 := REPLACE(texto2,CHR(13), '');
 				  texto2 := REPLACE(texto2,CHR(10), '');
				  texto := texto || texto2;
				  EXCEPTION
				  WHEN NO_DATA_FOUND THEN
				  EXIT;
			 END;
		END LOOP;

		 sys.utl_file.put_line(arqout, texto);
Responder
  • Informação