Ir al contenido


Foto

Dividir String Delimitado de acuerdo a una cantidad.


  • Por favor identifícate para responder
5 respuestas en este tema

#1 jorgebq77

jorgebq77

    Member

  • Miembros
  • PipPip
  • 11 mensajes

Escrito 12 octubre 2021 - 02:45

Saludos queridos compañeros del foro, quiero pedirles de favor que me ayuden a como puedo dividir un string delimitado en Delphi.
 
La idea es dividir un string delimitado de acuerdo a una cantidad especifica.
 
por ejemplo, tengo este string delimitado por comas :
 
Julio Iglesias, Roberto Carlos, Camilo Sesto, Jose Luis Perales, Joan Manuel Serrat, Nino Bravo, Nicola di Bari, Raphael, Jose Jose
 
Entonces lo que quiero es dividir ó partir este string delimitado de acuerdo a una cantidad por ejemplo 3, el resultado debe ser :
 
Julio Iglesias, Roberto Carlos, Camilo Sesto, 
Jose Luis Perales, Joan Manuel Serrat, Nino Bravo, 
Nicola di Bari, Raphael, Jose Jose
 
Otro ejemplo, si quiero dividir ó partir este string delimitado a una cantidad por ejemplo 4, el resultado debe ser :
 
Julio Iglesias, Roberto Carlos, Camilo Sesto, Jose Luis Perales, 
Joan Manuel Serrat, Nino Bravo, Nicola di Bari, Raphael, 
Jose Jose
 
Otro ejemplo, si quiero dividirlo a una cantidad de 6 el resultado seria :
 
Julio Iglesias, Roberto Carlos, Camilo Sesto, Jose Luis Perales, Joan Manuel Serrat, Nino Bravo, 
Nicola di Bari, Raphael, Jose Jose
 
Por ultimo si quiero dividirlo de 2 en 2 el resultado seria :
 
Julio Iglesias, Roberto Carlos, 
Camilo Sesto, Jose Luis Perales, 
Joan Manuel Serrat, Nino Bravo, 
Nicola di Bari, Raphael, 
Jose Jose
 
Espero que hayan entendido mi necesidad. Otra cosa como detalle opcional (lo hacen si quieren) es mostrar el resultado alineado a la derecha.
 
por ejemplo :
 
Julio Iglesias,             Roberto Carlos, 
Camilo Sesto,            Jose Luis Perales, 
Joan Manuel Serrat,  Nino Bravo, 
Nicola di Bari,            Raphael, 
Jose Jose
 
Muchas gracias por su ayuda y atención.
 
Att: Jorge

  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 21 octubre 2021 - 04:46

Una primera aproximacion que se entiende fácil es esta:


delphi
  1. function Divider(S: String; Num: integer; C: string): String;
  2. var
  3. i, n, L: integer;
  4. begin
  5. i:= 1;
  6. L:= Length(S);
  7. n:= 0;
  8. while(i<=L) and (Num > 0) do
  9. begin
  10. while (i<=L) and (S[i]<>C) do inc(i);
  11. inc(n);
  12. if (n mod Num) = 0 then
  13. begin
  14. S[i]:= #13;
  15. S[i+1]:= #10;
  16. end;
  17. inc(i);
  18. end;
  19. Result:= S;
  20. end;

Saludos.


  • 0

#3 jorgebq77

jorgebq77

    Member

  • Miembros
  • PipPip
  • 11 mensajes

Escrito 21 octubre 2021 - 09:15

Una primera aproximacion que se entiende fácil es esta:


delphi
  1. function Divider(S: String; Num: integer; C: string): String;
  2. var
  3. i, n, L: integer;
  4. begin
  5. i:= 1;
  6. L:= Length(S);
  7. n:= 0;
  8. while(i<=L) and (Num > 0) do
  9. begin
  10. while (i<=L) and (S[i]<>C) do inc(i);
  11. inc(n);
  12. if (n mod Num) = 0 then
  13. begin
  14. S[i]:= #13;
  15. S[i+1]:= #10;
  16. end;
  17. inc(i);
  18. end;
  19. Result:= S;
  20. end;

Saludos.

 
Muchas gracias querido escafandra...
 
Tu función hace el cometido, pero falta un detalle. Necesito que cada linea tenga al final el separador excepto la ultima.
 
Ya logre hacerlo mediante este código que hice, aunque no logro quitar la coma a la ultima linea... el método que hice es mas manual y un poco mas entendible...
 
aquí esta el código que hice :
 
 

delphi
  1. var
  2.  
  3.  Cadena, Caracter, Texto, S : string;
  4.  Cant, Item, I : Integer;
  5. begin
  6.   S      := EmptyStr;
  7.   Cadena := Edit1.Text;
  8.   Cant   := StrToIntDef(Edit2.Text, 1);  //cantidad a dividir
  9.  
  10.  
  11.   {Debemos asegurarmos de que la cadena termine en el delimitador
  12.   para poder obtener el ultimo string delimitado. }
  13.   if Copy(Cadena,Length(Cadena),1) <> ',' then //Si no termina en el delimitador
  14.     Insert(',', Cadena, Length(Cadena) + 1);  //Se lo asignamos
  15.  
  16.  
  17.   Item := 0;
  18.  
  19.  
  20.   for I:= 1 to Length(Cadena) do
  21.     begin
  22.       Caracter := Cadena[I];  //igual a Caracter := Copy(Cadena,I,1);
  23.  
  24.  
  25.       // Comparo si el caracter es igual a "," si es asi, lo acumulo.
  26.       if Caracter = ',' then
  27.         begin
  28.           Inc(Item);
  29.  
  30.  
  31.           if Cant = Item then //PARA LIMITAR LA CANTIDAD DE ITEMS POR LINEA
  32.             begin
  33.               S := S + Texto +','+ #13;
  34. //              S := S + Texto +','+ sLineBreak;
  35.               Texto:= '';
  36.               Item := 0;   // lo ponemos en cero para volver a contar
  37.             end
  38.           else
  39.             if (Caracter = ',') and (Item < Cant) then
  40.                Texto:= Texto + ',';  //para separar cada item por su delimitador
  41.         end
  42.       else  // si no voy armando mi texto que desarme ya separado por coma (,)
  43.         begin
  44.           Texto:= Texto + Caracter;
  45.         end;
  46.  
  47.  
  48.       if (I >= LastDelimiter(',',Cadena)) then //si el ultimo delimitador
  49.         begin
  50.           S := S + Texto;   //DEBO DE QUITAR LA ULTIMA COMA...
  51.         end;
  52.     end;
  53.  
  54.  
  55. ShowMessage(S);    //AQUI MUESTRO EL RESULTADO FINAL... SE PUEDE MOSTRAR EN UN MEMO PARA MAS CLARIDAD.  

 
 
 
Para quitar la coma a la ultima linea intente por estos métodos pero no me sale... algo se me escapa.... jajjajaa
 
  if AnsiRightStr(S,1) = ',' then
 
  if S[Length(S)] = ',' then
    Delete(S, Length(S), 1); //Quitamos la ultima coma
 
tambien Copy(S, 0, Length(S)-1);
 
 
Si alguien me ayuda a mejorarlo estaré agradecido....
  • 0

#4 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 21 octubre 2021 - 05:27

Cuando publiques código pon las etiquetas correspondientes para que se publique como tal. Fíjate como queda tras editar tu mensaje,

 

Te propongo un código más general dividido en dos funciones. La primera Split que devuelve la subcadena delimitada por un separador marcado por un indice. La segunda monta tu cadena.

 

La primera función es general y sirve para multipropósito cuando se quiere romper una cadena en subcadenas y funciona como una especie de array de cadenas delimitadas por un separador:


delphi
  1. //---------------------------------------------------------------------------
  2. // Extrae cadenas separadas por un separador C
  3. // Ind es el indice de la cadena a extraer, comenzando por 0
  4. function Split(S: String; Ind: integer; C: CHAR): String;
  5. var
  6. I, F, N: integer;
  7. begin
  8. I:= 1;
  9. N:= Length(S);
  10. while Ind>0 do
  11. begin
  12. while(I<=N) and (S[i]<>C) do inc(I);
  13. inc(I); dec(Ind);
  14. end;
  15. F:= I;
  16. while(F<=N) and (S[F]<>C) do inc(F);
  17.  
  18. Result:= Copy(S, I, F-I);
  19. end;

Ahora la función específica para tu caso:


delphi
  1. function Divider(S: String; Num: integer; C: CHAR): String;
  2. var
  3. i: integer;
  4. T: String;
  5. begin
  6. Result:= '';
  7. i:= 1;
  8. T:= Trim(Split(S, 0, C));
  9. if(num>0) then
  10. while T <> '' do
  11. begin
  12. Result:= Result + T + C + ' ';
  13. if (i mod Num) = 0 then
  14. Result:= Result + #13#10;
  15. T:= Trim(Split(S, i, C));
  16. inc(i);
  17. end;
  18. i:= Length(Result);
  19. while (i>0) and (Result[i]<>C) do dec(i);
  20. Result:= Copy(Result, 1, i-1);
  21. end;

Las tres últimas líneas limpian la coma final. Date cuenta que puede ser una coma con un espacio en blanco o con un retorno de línea. Eñ código busca la coma desde el final de la cadena y la elimina

 


  • 0

#5 jorgebq77

jorgebq77

    Member

  • Miembros
  • PipPip
  • 11 mensajes

Escrito 22 octubre 2021 - 07:03

Muchas gracias amigo escafandra, tu código finalmente funciono como esperaba... Discúlpame que no etiquete el código, es que no se como hacerlo  :(.

 

Espero es que este tema le sirva a alguien mas ya que tuvo muchas visitas y nadie se animaba a contestar.


  • 0

#6 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 22 octubre 2021 - 10:24

Discúlpame que no etiquete el código, es que no se como hacerlo  :(

En el editor debes seleccionar la etiqueta de código

 

post-12294-0-41540300-1635001766.png

 

 

loading.gif

Saludos.

Archivos adjuntos


  • 1




IP.Board spam blocked by CleanTalk.