Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Pasar una cadena (string) a una lista (tstringlisg) según delimitador (https://www.clubdelphi.com/foros/showthread.php?t=87345)

pabloe9k 17-12-2014 20:16:02

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.

escafandra 18-12-2014 00:48:19

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.

nlsgarcia 18-12-2014 05:48:18

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)....

:rolleyes:

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.

escafandra 18-12-2014 19:50:11

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.

Casimiro Notevi 18-12-2014 19:56:19

Cita:

Empezado por escafandra (Mensaje 486810)
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.

nlsgarcia 18-12-2014 21:16:46

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.

ecfisa 18-12-2014 22:23:09

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 :)

alquimista 20-12-2014 22:44:18

La vi por internet y la uso mucho. No se si servirá.

alquimista 20-12-2014 22:45:35

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


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

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