Tokenizer-Go string c/fields Sep. by "; & quot

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
  

Poston Wed, 08 Feb 2006 2:25 pm

Good afternoon!!

I'm reading an excel worksheet on forms, with PL/SQL using the TEXT_IO. Each row has the fields separator \";\", being that I have to take every last one of these fields and play in a variable. I believe someone may have already done this, or something like that, I wonder if someone could give me a hint????

ps: I know that with the SqlLoader is very easy, even I'vê done more in this case has q be anyway, on hand!

Thanks for your attention!
Filipe_Geissler
Location: Canoas - RS

Poston Wed, 08 Feb 2006 3:30 pm

I have an interesting routine, but I think it does not apply to your case. This routine is more useful in passing parameters when you don't know the number of input parameters.

Take a look:
Code: Select all
set ver off
def Del='@'
def String="@0@11@222@3333@44444@555555@6666666@77777777@888888888"

select
Rownum Row#,
SUBSTR(A.Str||'&Del'
, INSTR(A.Str||'&Del' , '&Del', 1, Rownum ) +1
, INSTR(A.Str||'&Del' , '&Del', 1, Rownum+1)
-INSTR(A.Str||'&Del' , '&Del', 1, Rownum ) -1
) Token
From
(
select
'&String' Str
from dual
)
A,
all_objects B
where
Rownum< length(A.Str)-length(REPLACE(A.Str,'&Del'))+1
;


ROW#       TOKEN
---------- -------------------------------------------------------
1          0
2          11
3          222
4          3333
5          44444
6          555555
7          6666666
8          77777777
9          888888888

I think you'll get with this INSTR. ... puts a LOOP and will getting the SUBSTR between a; and another ...:-o
dr_gori
Location: Portland, OR USA

Thomas F. G

Você já respondeu a dúvida de alguém hoje?
http://glufke.net/oracle/search.php?search_id=unanswered

Poston Thu, 09 Feb 2006 7:40 am

I got:
Code: Select all
begin
   
   in_file := Text_IO.Fopen(filename, 'r');
   -- loop para percorrer todas a linhas do arquivo
   LOOP
    begin
       Text_IO.Get_Line(in_file, linebuf);
       i := 0;
       numseparador := 1;
       aux := null;
       -- for para percorrer a linha caracter à caracter
         for i in 1..length(linebuf) loop
          caracter := ( substr(linebuf, i, 1));
          -- cada vez que achar o separador ";", separa o campo
          if caracter = ';' then
             if numseparador = 1 then
                ano := aux;
             elsif numseparador = 2 then
                mês := aux;
             elsif numseparador = 3 then
                pv := aux;
             elsif numseparador = 4 then
                valor_fat := aux;
             end if;
             -- incrementa o separador, que vai indicar o proximo campo
             numseparador := numseparador + 1;
             aux := null;             
          -- se não achar o separador, vai montando o campo ate achar o separador
          else
             aux := aux || caracter;
          end if;               
       end loop;
       message(ano || ' - ' || mês || ' - ' || pv || ' - ' || valor_fat);
       -- validações aqui...
      exception
        when no_data_found then
          Text_IO.Fclose(in_file);
          exit;
      end;
   END LOOP;
   
end;
This code reads the file line by line and character by character until you find the \";\" when you think the \";\" plays the string \"aux\" mounted on variable ...
Worked very well. I posted here to leave how to query for someone else!!
Any questions just ask!

falow
Filipe_Geissler
Location: Canoas - RS

Poston Wed, 22 Feb 2006 7:22 am

For those who like to use pl/table ai will ...

Code: Select all
/********************************************************************************************/
  /* Rotina responsável em separar "cargas" de dados que utilizam um separador em um "array"  */
  /********************************************************************************************/
  procedure prc_separa_texto( pTexto in varchar2, pSeparador in varchar2 default null ) is
    --
    pSeparador varchar2(1);
    --
    vContador number := 1;
     vInicio   number := 1;
     vFim      number := 0;
     --
     type tG_Array_Texto is table of varchar2(4000) index by binary_integer;
    vG_Texto_Separado tG_Array_Texto;
    --
   begin
     --
     loop
       --
       vFim := instr( pTexto, pSeparador, 1, vContador );
       --
       exit when vFim = 0;
       --
       vG_Texto_Separado(vContador) := substr( pTexto, vInicio, vFim - vInicio );
       --
       vInicio   := vFim      + 1;
       vContador := vContador + 1;
       --
     end loop;
    --
  end;
8)
leobbg
Location: PORTO ALEGRE - RS

Leo BBG Consultor Oracle

Poston Wed, 21 May 2008 5:01 pm

Another way to tokenize.
It is necessary the creation of type TP_VARCHAR2 with the command below:
Code: Select all
CREATE TYPE TP_VARCHAR2 AS TABLE OF VARCHAR2(2000)
Code: Select all
CREATE OR REPLACE FUNCTION FNC_TOKENIZER(P_STRING    IN VARCHAR2,
                                         P_SEPARADOR IN VARCHAR2)
   RETURN TP_VARCHAR2 PIPELINED IS
   l_string LONG DEFAULT p_string || p_separador;
   n        NUMBER;
   /*----------------------------------------------------------------------*/
   /* Nome : FNC_PHW_TOKENIZER                                             */
   /* Descrição : Função para separação, em linhas diferentes, de valo-    */
   /* res de uma lista que utilize algum tipo de separador                 */
   /* Ex.: "A, B, C", separa cada letra num linha diferente                */
   /* Utilização:                                                          */
   /* select column_value valor from TABLE(fnc_tokenizer('A,B,C',','))     */
   /* Autor : Getulio Holtz (TechnoCorp)                                   */
   /* Data : 27 de Setembro de 2006                                        */
   /* É necessário a criação do tipo TP_VARCHAR2 com o comando abaixo:     */
   /* CREATE TYPE TP_VARCHAR2 AS TABLE OF VARCHAR2(2000)                   */
   /*----------------------------------------------------------------------*/


BEGIN
   LOOP
      EXIT WHEN nvl(l_string,' ') = ' ';
      n := instr(l_string,
                 p_separador);
      dbms_output.put_line(n);
      PIPE ROW(ltrim(rtrim(substr(l_string,
                                  1,
                                  n - 1))));
      l_string := substr(l_string,
                         n + 1);
   END LOOP;
   RETURN;
END FNC_TOKENIZER;
/
dr_gori
Location: Portland, OR USA

Thomas F. G

Você já respondeu a dúvida de alguém hoje?
http://glufke.net/oracle/search.php?search_id=unanswered

Poston Fri, 05 Oct 2012 10:39 am

Here's one more way to tokenize, contribution of Paulo Diniz (Mato Grosso do Sul) That uses regular expressions and CONNECT BY:-)

Code: Select all
select REGEXP_SUBSTR(str, exp, 1, level) lista
from (select 'paulo@email.com;thomas@email.com' str, '[^;]+' exp
      from dual)
connect by REGEXP_SUBSTR(str, exp, 1, level) is not null
Exit:
Code: Select all
LISTA
--------------------------------
paulo@email.com
thomas@email.com
has a document that explains how to do the opposite, IE: get several lines and combine in an o.r., delimited by a character. (using the native function of 11 g named LISTAGG).
https://docs.google.com/file/d/0B7CiEAx ... t?hl=en_US or http://www.linkedin.com/groups/Converte ... RITM-title
dr_gori
Location: Portland, OR USA

Thomas F. G

Você já respondeu a dúvida de alguém hoje?
http://glufke.net/oracle/search.php?search_id=unanswered


  • See also
    Replies
    Views
    Last Post


      Return to PL/SQL

      Who is online

      Users browsing this forum: No registered users and 3 guests