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 24-02-2015
JuanOrtega JuanOrtega is offline
Miembro
NULL
 
Registrado: sep 2011
Posts: 130
Poder: 13
JuanOrtega Va por buen camino
Funcion split en Delphi

Hola tengo la siguiente funcion split en Delphi que funciona perfecto el problema es quiero mejorar el codigo para no usar mas repeat-until pero no se de que otra forma hacerlo.

El codigo es este :

Código Delphi [-]

type
  TSarray = array of string;

function Split(Texto, Delimitador: string): TSarray;

var
  o: integer;
  PosDel: integer;
  Aux: string;

begin

  o := 0;
  Aux := Texto;
  SetLength(Result, Length(Aux));

  repeat

    PosDel := Pos(Delimitador, Aux) - 1;

    if PosDel = -1 then
    begin
      Result[o] := Aux;
      break;
    end;

    Result[o] := copy(Aux, 1, PosDel);
    delete(Aux, 1, PosDel + Length(Delimitador));
    inc(o);
  until Aux = '';
end;

Un ejemplo de uso :

Código Delphi [-]
var texto,deli:string;
    all_array:TSarray;
begin
deli := 'test';
texto := deli+'hi world 1'+deli+'hi world 2'+deli;
end;

all_array := Split(texto,deli);
ShowMessage(all_array[1]);
ShowMessage(all_array[2]);
end;

¿ Que alternativas tengo ante repeat-until ?

Última edición por JuanOrtega fecha: 24-02-2015 a las 16:23:36.
Responder Con Cita
  #2  
Antiguo 24-02-2015
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 Lepuke.
Y los enlaces que figuran al pié de esta página...

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 24-02-2015
JuanOrtega JuanOrtega is offline
Miembro
NULL
 
Registrado: sep 2011
Posts: 130
Poder: 13
JuanOrtega Va por buen camino
funcionan bien efcisa , gracias por la ayuda y ¿ tenes links donde no usen classes como el codigo que mostre ? porque es una aplicacion consola y classes le suma mucho peso ejecutable.
Responder Con Cita
  #4  
Antiguo 24-02-2015
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 Lepuke.
Cita:
Empezado por Lepuke Ver Mensaje
funcionan bien efcisa , gracias por la ayuda y ¿ tenes links donde no usen classes como el codigo que mostre ? porque es una aplicacion consola y classes le suma mucho peso ejecutable.
No, pero te hice un procedimiento que creo te va a servir:
Código Delphi [-]
program Project2;
{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TVecStr = array of string;

procedure Split(Cadena: string; const Delim: Char; var vec: TVecStr);
var
  p: Integer;
begin
  Cadena:= Cadena + Delim;
  while Length(Cadena) > 0 do
  begin
    p:= Pos(Delim, Cadena);
    if p = Length(Cadena) then
      SetLength(Cadena, Length(Cadena)-1);
    SetLength(vec, Length(vec)+1);
    vec[High(vec)]:= Copy(Cadena, 1, p-1);
    Delete(Cadena, 1, p);
  end;
end;

var
  s: string;
  v: TVecStr;
  i: Integer;
begin
  s:= 'la coma(,)se,usara,como delimitador,para,el ejemplo';
  Split(s, ',', v);
  for i:= Low(v) to High(v) do Writeln(v[i]);
  v:= nil;
  Readln;
end.
Salida:



Saludos
__________________
Daniel Didriksen

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

Última edición por ecfisa fecha: 24-02-2015 a las 17:35:28.
Responder Con Cita
  #5  
Antiguo 24-02-2015
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 Lepuke.

Idea que se me hace muy similar a esta (mas completa) de ... diciembre del 2011

El Alzheimer me debe estar pegando duro...

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #6  
Antiguo 24-02-2015
JuanOrtega JuanOrtega is offline
Miembro
NULL
 
Registrado: sep 2011
Posts: 130
Poder: 13
JuanOrtega Va por buen camino
te agradezco mucho la ayuda ecfisa , al parecer tengo un problema con la funcion porque cuando pide char la variable del delimitador me da un error cuando uso un string intente usar un pchar() pero sigue dando el error , probe cambiando el valor delim de char a string para hacerlo funcionar y poder leer los datos del ejecutable pero se estanco todo el programa en esta parte :

Código Delphi [-]
    p:= Pos(Delim, Cadena);

No tira ningun error solo queda esperando en esa linea.

El codigo :

Código Delphi [-]
type
  TVecStr = array of string;

procedure Split(Cadena: string; const Delim: string; var vec: TVecStr);
var
  p: Integer;
begin
  Cadena:= Cadena + Delim;
  while Length(Cadena) > 0 do
  begin
    p:= Pos(Delim, Cadena);
    if p = Length(Cadena) then
      SetLength(Cadena, Length(Cadena)-1);
    SetLength(vec, Length(vec)+1);
    vec[High(vec)]:= Copy(Cadena, 1, p-1);
    Delete(Cadena, 1, p);
  end;
end;


var texto,todo:string;
    TodoArray: TVecStr;
    delimitador:string;
begin

delimitador := 'delimitador';

todo := read_file(paramstr(0));

Split(todo,delimitador,TodoArray);

Writeln(TodoArray[1]);

Estoy usando este codigo para leer los datos del login de mi agenda que tengo generados desde el instalador en mi ejecutable para poder leerlos y comprobar los datos.
Responder Con Cita
  #7  
Antiguo 24-02-2015
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 Lepuke
Cita:
Empezado por Lepuke Ver Mensaje
te agradezco mucho la ayuda ecfisa , al parecer tengo un problema con la funcion porque cuando pide char la variable del delimitador me da un error cuando uso un string ...
Ha... pero fijate que la función si bien recibe un string no lo toma como tál arbitrariamente, sino como un grupo de delimitadores.

En el ejemplo envío la cadena: ' ,;-.:' que corresponde a: espacio, coma, punto y coma, guión, punto y dos puntos.
Si enviaras como argumento 'delimitador', interpretaría a: d,e,l,i,m,t,a,o,r como delimitadores.


Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #8  
Antiguo 25-02-2015
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 de nuevo.

A ver si lo que buscas es algo como esto:
Código Delphi [-]
program Project2; {$APPTYPE CONSOLE}

uses
  SysUtils, StrUtils;

type
  TVecStr = array of string;

procedure SplitStr(Cadena: string; delim: string; var vec: TVecStr);
var
  i, p1, p2: Integer;
begin
  Cadena:= Cadena + delim;
  p2:= Pos(delim, Cadena);
  p1:= 1;
  while p1 <= p2 do
  begin
    SetLength(vec, Length(vec) + 1);
    vec[High(vec)]:= Copy(Cadena, p1, p2 - p1);
    p1:= p2 + Length(delim);
    p2:= PosEx(delim, Cadena, p1);
  end;
end;

// Ejemplo de uso
var
  v: TVecStr;
  s: string;
  i: Integer;
begin
  s:= 'UNO BLA BLAdelimitadorDOS BLA BLAdelimitadorTRES BLA BLA'+
      'delimitadorCUATRO BLA BLAdelimitadorCINCO BLA BLAdelimitador'+
      'SEIS BLA BLAdelimitadorSIETE BLA BLA';
  SplitStr(s, 'delimitador', v);
  for i:= Low(v) to High(v) do Writeln(v[i]);
  v:= nil;
  Readln;
end.
Salida:



Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #9  
Antiguo 25-02-2015
JuanOrtega JuanOrtega is offline
Miembro
NULL
 
Registrado: sep 2011
Posts: 130
Poder: 13
JuanOrtega Va por buen camino
funciona perfecto , gracias por la ayuda ecfisa.
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
función split en delphi sergionr Varios 9 04-04-2013 17:47:03
funcion split de una cadena look OOP 4 10-10-2011 23:14:56
Funcion Split D.M.Nieto Lazarus, FreePascal, Kylix, etc. 1 11-03-2008 18:27:17
comando split ó explode en delphi srangel Internet 2 09-05-2006 19:17:55
SPLIT en delphi, pero sin tener en cuenta espacios en blanco acl_gandalf Varios 1 08-04-2005 14:24:56


La franja horaria es GMT +2. Ahora son las 17:47:25.


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