Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Funcion split en Delphi (https://www.clubdelphi.com/foros/showthread.php?t=87777)

JuanOrtega 24-02-2015 16:04:00

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 ?

ecfisa 24-02-2015 16:27:56

Hola Lepuke.
Y los enlaces que figuran al pié de esta página...

Saludos :)

JuanOrtega 24-02-2015 16:38:01

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.

ecfisa 24-02-2015 17:31:26

Hola Lepuke.
Cita:

Empezado por Lepuke (Mensaje 489260)
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 :)

ecfisa 24-02-2015 17:45:32

Hola Lepuke.

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

El Alzheimer me debe estar pegando duro... :D

Saludos :)

JuanOrtega 24-02-2015 17:50:51

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.

ecfisa 24-02-2015 18:04:17

Hola Lepuke
Cita:

Empezado por Lepuke (Mensaje 489265)
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 :)

ecfisa 25-02-2015 04:10:34

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

JuanOrtega 25-02-2015 16:38:04

funciona perfecto , gracias por la ayuda ecfisa.


La franja horaria es GMT +2. Ahora son las 08:47: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