Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-12-2014
pabloe9k pabloe9k is offline
Registrado
NULL
 
Registrado: oct 2013
Posts: 5
Poder: 0
pabloe9k Va por buen camino
Question Pasar una cadena (string) a una lista (tstringlisg) según delimitador

Hola.
Les hago una consulta: tengo una cadena (string) con un texto asignado. Este texto contiene una serie de caracteres que quisiera usar como delimitadores y convertir la cadena a distintos items de una lista según este delimitador. Por ejemplo, mi cadena es

+ EBML head'#$D#$A'|+ EBML version: 1'#$D#$A'|+ EBML read version: 1'#$D#$A'|+ EBML maximum ID length: 4'#$D#$A'

y quisiera pasarlo a una lista utilizando el delmitador '#$D#$A'
El resultando sería algo como:

lista[0]:= + EBML head
lista[1]:= |+ EBML version: 1
lista[2]:=|+ EBML read version: 1
lista[3]:=|+ EBML maximum ID length: 4

Esto es muuuuuy fácil de hacer en PHP con la función "explode", pero no tengo idea de como se hace con Delphi 7.
Podrán ayudarme, por favor?

Gracias.
Slds.
Responder Con Cita
  #2  
Antiguo 18-12-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Ejemplo visual con TMemo (puedes hacer lo mismo con un TStringList):
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Text:= '+ EBML head'+#$D#$A+'|+ EBML version: 1'+#$D#$A+'|+ EBML read version: 1'+#$D#$A+'|+ EBML maximum ID length: 4'+#$D#$A;
end;

Saludos.
Responder Con Cita
  #3  
Antiguo 18-12-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
pabloe9k,

Cita:
Empezado por pabloe9k
...Pasar una cadena string (+ EBML head#$D#$A|+ EBML version: 1#$D#$A|+ EBML read version: 1#$D#$A|+ EBML maximum ID length: 4#$D#$A) a una lista TStringList según delimitador (#$D#$A)....


Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const
   InputString = '+ EBML head' + #$D#$A +
                 'EBML version: 1' + #$D#$A +
                 'EBML read version: 1' + #$D#$A +
                 '|+ EBML maximum ID length: 4' + #$D#$A;

var
   SL : TStringList;
   i : Integer;

begin
   SL := TStringList.Create;
   ExtractStrings([#$D,#$A],[],InputString,SL);
   for i := 0 to SL.Count - 1 do
      ShowMessage(SL[i]);
   SL.Free;
end;

end.
El código anterior en Delphi 7 sobre Windows 7 Professional x32, carga el texto contenido en la variable InputString a un TStringList usando como delimitador #$D#$A y muestra cada uno de los elementos individuales.

Revisa esta información:
Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 18-12-2014 a las 06:41:37.
Responder Con Cita
  #4  
Antiguo 18-12-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Teniendo en cuenta que la cadena mostrada por pabloe9k contiene como delimitador $D#$A y sabiendo que jústamente representan retorno de carro + avance de línea (CRLF), un TStringList parte directamente el texto en las líneas correspondientes sin más código que una simple asignación.

Saludos.
Responder Con Cita
  #5  
Antiguo 18-12-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por escafandra Ver Mensaje
Teniendo en cuenta que la cadena mostrada por pabloe9k contiene como delimitador $D#$A y sabiendo que jústamente representan retorno de carro + avance de línea (CRLF), un TStringList parte directamente el texto en las líneas correspondientes sin más código que una simple asignación. Saludos.
Exactamente, no hay que hacer nada.
Responder Con Cita
  #6  
Antiguo 18-12-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
escafandra,

Cita:
Empezado por escafandra
...un TStringList parte directamente el texto en las líneas correspondientes sin más código que una simple asignación...
Es correcto

Cita:
Empezado por pabloe9k
...Esto es muuuuuy fácil de hacer en PHP con la función "Explode", pero no tengo idea de como se hace con Delphi 7...
La idea era mostrar que existe la función ExtractStrings de Delphi equivalente a la función Explode de PHP con la cual se puede hacer Split de texto en función de diversos delimitadores, ciertamente hubiera sido suficiente hacer:
Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
const
   InputString = '+ EBML head' + #$D#$A +
                 'EBML version: 1' + #$D#$A +
                 'EBML read version: 1' + #$D#$A +
                 '|+ EBML maximum ID length: 4' + #$D#$A;

var
   SL : TStringList;
   i : Integer;

begin
   SL := TStringList.Create;
   SL.Text := InputString;
   for i := 0 to SL.Count - 1 do
      ShowMessage(SL[i]);
   SL.Free;
end;
Espero sea útil

Nelson.
Responder Con Cita
  #7  
Antiguo 18-12-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Según entiendo, ya me dirán si me equivoco los que saben PHP, la función explode, es mas poderosa que ExtractStrings para este caso, ya que la primera admite como delimitador una cadena y la segunda sólo caracteres.

Como ya lo han expuesto claramente, la diferencia no es relevante en una variable que ha sido compuesta por caracteres y delimitadores:
Código Delphi [-]
   str:= '+ EBML head' + #$D#$A + '|+ EBML version: 1' + #$D#$A + 
           '|+ EBML read version: 1' + #$D#$A + '|+ EBML maximum ID length: 4' + #$D#$A;
Pero el caso es muy distinto si, la cadena es extraída literalmente de un archivo y lo que eran caracteres de control pasan a ser texto plano. Por ejemplo el archivo cadena.txt con el contenido:
Cita:
+ EBML head'#$D#$A'|+ EBML version: 1'#$D#$A'|+ EBML read version: 1'#$D#$A'|+ EBML maximum ID length: 4'#$D#$A'
A diferencia de explode, que por lo que leí no tendría inconveniente en manejar la situación, no hay manera de usar un delimitador como '#$D#$A' con ExtractStrings .

En este último caso habría que crear un procedimiento a tal fin:
Código Delphi [-]
...
uses StrUtils;

procedure Explode(Str, SubStr: string; TS: TStrings);
var
  p: Integer;
begin
  SubStr:= QuotedStr(SubStr);
  repeat
    p:= PosEx(SubStr, Str, 1);
    TS.Add(Copy(Str, 1, p-1));
    Delete(Str, 1, (p-1)+Length(SubStr));
  until Length(Str)=0;
end;
Llamada:
Código Delphi [-]
procedure TForm1.btnExplodeClick(Sender: TObject);
begin
  with TStringList.Create do
  try
    LoadFromFile('cadena.txt');
    Explode(Text, '#$D#$A', Memo1.Lines);
  finally
    Free;
  end;
end;

Quedo a la espera de que pabloe9k, me disipe la duda del orígen de los datos...

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 19-12-2014 a las 04:49:37. Razón: agregar: uses StrUtils;
Responder Con Cita
  #8  
Antiguo 20-12-2014
alquimista alquimista is offline
Miembro
 
Registrado: ene 2008
Posts: 203
Poder: 17
alquimista Va por buen camino
La vi por internet y la uso mucho. No se si servirá.
Responder Con Cita
  #9  
Antiguo 20-12-2014
alquimista alquimista is offline
Miembro
 
Registrado: ene 2008
Posts: 203
Poder: 17
alquimista Va por buen camino
Código Delphi [-]
function GetToken(Cadena,Separador:string;Token:integer):string;
 {
 Cadena     es la string en la que buscar el token
 Separador  es la string que separa cada token
 Token      es el número de token que buscamos   (desde 1 a n)
 'hola#pepe# luis'->separador(#), token1='hola' 

 }
 begin
   while Token > 1 do
   begin
     Delete(Cadena,1,Pos(Separador,Cadena));
     Dec(Token);
   end;
   if Pos(Separador,Cadena)>0 then // modificado para que salga la última palabra
     Result:=Copy(Cadena,1,Pos(Separador,Cadena)-Length(Separador))
   else
    Result:=Cadena;
 end;


Código Delphi [-]
var st1, st:string;
  begin
   st1:= 'hola#pepe# luis';
   st:=GetToken(st1,'#',2);
//st:=pepe
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como separar una cadena con un delimitador radge Varios 13 05-03-2016 22:52:52
Añadir carácter según una posición x a un String Ledian_Fdez OOP 3 01-08-2013 16:22:21
String a Cadena de Bytes a cadena Hexadecimal ruedabeat2003 Varios 2 11-01-2012 02:04:06
Descomponer cadena @String Alejo15x Varios 3 04-02-2010 03:23:21
Recorrer un string y actuar segun palabras leidas vcs Varios 16 14-11-2008 14:51:31


La franja horaria es GMT +2. Ahora son las 01:01:50.


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
Copyright 1996-2007 Club Delphi