Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Parsear datos de un Memo (https://www.clubdelphi.com/foros/showthread.php?t=84344)

ZayDun 08-10-2013 17:03:37

Parsear datos de un Memo
 
Hola, quiero extraer datos que me llegan a un memo, pensaba que sería lo mas fácil de hacer, pero cuando he realizado unas pruebas he visto que estoy haciendo algo mal y no se donde esta el problema. Si alguien me pudiese orientar un poco se lo agradecería.


Código Delphi [-]
Var
Time:String;
i:integer
Begin
Time:=Memo1.Lines.Text;

// Datos a extraer del memo duracion=12:25"
for i:=1 to Memo1.Lines.Count-1 do
If Pos('duracion=',Time)>0 Then
Begin
Delete (Time,1,Pos('duracion="',Time)+8);
Delete (Time,Pos ('"',Time),MaxInt);
Memo2.Lines.Add(Time);
End;

Al recorrer el memo me muestra unicamente un dato, cuando pensaba que recorrería todo el memo1 y me añadiria los resultados en el memo2.

ecfisa 08-10-2013 17:36:41

Hola ZayDun.

Sería bueno ver un ejemplo de la cadena origen y que parte de ella queres extraer.
Por ejemplo, algo que no entiendo es que papel juega la subcadena 'data-context-item-time="'. Tampoco está claro si la cadena "duracion=12:25' aparece mas de una vez en Memo1, etc, etc.

Pero si me atengo de forma estricta a lo que indicas en la línea comentada del código,
Código Delphi [-]
// Datos a extraer del memo duracion=12:25"
diría que podes hacer:
Código Delphi [-]
var
  cad:string;
begin
  cad := 'duracion=12:25"';
  Memo2.Lines.Add(Copy(Memo1.Text, Pos(cad, Memo1.Text), Length(cad)));
end;

Saludos :)

ZayDun 08-10-2013 17:39:24

Cita:

Empezado por ecfisa (Mensaje 468014)
Hola ZayDun.

Sería bueno ver un ejemplo de la cadena origen y que parte de ella queres extraer.
Por ejemplo, algo que no entiendo es que papel juega la subcadena 'data-context-item-time="'. Tampoco está claro si la cadena "duracion=12:25' aparece mas de una vez en Memo1, etc, etc.

Pero si me atengo de forma estricta a lo que indicas en la línea comentada del código, diría que podes hacer:
Código Delphi [-]
// Datos a extraer del memo duracion=12:25"
var
  cad:string;
begin
  cad := 'duracion=12:25"';
  Memo2.Lines.Add(Copy(Memo1.Text, Pos(cad, Memo1.Text), Length(cad)));
end;

Saludos :)

Muchas gracias por tu ayuda tan rapida, la cadena data-context-item-time=" es un valor que me confundí a la hora de ponerlo, ya lo edite. gracias de nuevo funciona tal y como yo queria.

duilioisola 10-10-2013 16:04:56

El problema que tienes es que lo recorres hacia adelante.
Deberías recorrerlo hacia atrás (si utilizas FOR...DO).
Código Delphi [-]
Var
   Time : String;
   i : integer
Begin
   Time := Memo1.Lines.Text;

   // Datos a extraer del memo duracion = 12:25"
   for i:= Memo1.Lines.Count-1 downto 1 do
      If Pos('duracion=',Time) > 0 Then
      Begin
         Delete (Time,1,Pos('duracion="', Time) + 8);
         Delete (Time, Pos ('"', Time), MaxInt);
         Memo2.Lines.Add(Time);
      End;

El problema es que recorres la lista según el índice
Si encuentras, borras el elemento en la posición del indice. Esto hace que todo lo que le sigue "caiga" una posición.
Luego el FOR avanza el indice y esa posición ya no la has tratado.

Deberías hacerlo con un WHILE e incrementar el índice solo si no encuentras lo que buscas.

ZayDun 10-10-2013 18:59:18

Cita:

Empezado por duilioisola (Mensaje 468133)
El problema que tienes es que lo recorres hacia adelante.
Deberías recorrerlo hacia atrás (si utilizas FOR...DO).
Código Delphi [-]
Var
   Time : String;
   i : integer
Begin
   Time := Memo1.Lines.Text;

   // Datos a extraer del memo duracion = 12:25"
   for i:= Memo1.Lines.Count-1 downto 1 do
      If Pos('duracion=',Time) > 0 Then
      Begin
         Delete (Time,1,Pos('duracion="', Time) + 8);
         Delete (Time, Pos ('"', Time), MaxInt);
         Memo2.Lines.Add(Time);
      End;

El problema es que recorres la lista según el índice
Si encuentras, borras el elemento en la posición del indice. Esto hace que todo lo que le sigue "caiga" una posición.
Luego el FOR avanza el indice y esa posición ya no la has tratado.

Deberías hacerlo con un WHILE e incrementar el índice solo si no encuentras lo que buscas.


Gracias por tu explicación, estoy intentando mediante WHITE, pero la verdad que estoy dando muchas vueltas y aunque he visto varios ejemplos no me queda claro como utilizarlo.

Código Delphi [-]
While i <= Memo1.Lines.Count-1 do //??
begin
...
End;

ecfisa 11-10-2013 00:24:30

Hola ZayDun.

Por eso te preguntaba si la cadena buscada aparecía mas de una vez en el contenido del memo y si deseabas eliminar todas...

Si deseas borrar todas las ocurrencias de determinada cadena dentro del contenido del memo, podes hacer:
Código Delphi [-]
uses StrUtils;

procedure BorrarOcurrencias(M : TMemo; const Texto : string);
var
  p1, p2: Integer;
  s: string;
begin
  s  := M.Text;
  p2 := 1;
  repeat
    p1 := PosEx(Texto, s, p2);
    Delete(s, p1, Length(Texto));
    p2 := p1;
  until (p1 = 0) or (p1 > p2);
  M.Text := s;
end;

Uso:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  BorrarOcurrencias(Memo1, 'duracion=12:25"')
end;

Saludos :)


La franja horaria es GMT +2. Ahora son las 17:19:32.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi