
Dividir String Delimitado de acuerdo a una cantidad.
#1
Posted 12 October 2021 - 02:45 PM
#2
Posted 21 October 2021 - 04:46 AM
Una primera aproximacion que se entiende fácil es esta:
function Divider(S: String; Num: integer; C: string): String; var i, n, L: integer; begin i:= 1; L:= Length(S); n:= 0; while(i<=L) and (Num > 0) do begin while (i<=L) and (S[i]<>C) do inc(i); inc(n); if (n mod Num) = 0 then begin S[i]:= #13; S[i+1]:= #10; end; inc(i); end; Result:= S; end;
Saludos.
#3
Posted 21 October 2021 - 09:15 AM
Una primera aproximacion que se entiende fácil es esta:
delphi
function Divider(S: String; Num: integer; C: string): String; var i, n, L: integer; begin i:= 1; L:= Length(S); n:= 0; while(i<=L) and (Num > 0) do begin while (i<=L) and (S[i]<>C) do inc(i); inc(n); if (n mod Num) = 0 then begin S[i]:= #13; S[i+1]:= #10; end; inc(i); end; Result:= S; 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 :
var Cadena, Caracter, Texto, S : string; Cant, Item, I : Integer; begin S := EmptyStr; Cadena := Edit1.Text; Cant := StrToIntDef(Edit2.Text, 1); //cantidad a dividir {Debemos asegurarmos de que la cadena termine en el delimitador para poder obtener el ultimo string delimitado. } if Copy(Cadena,Length(Cadena),1) <> ',' then //Si no termina en el delimitador Insert(',', Cadena, Length(Cadena) + 1); //Se lo asignamos Item := 0; for I:= 1 to Length(Cadena) do begin Caracter := Cadena[I]; //igual a Caracter := Copy(Cadena,I,1); // Comparo si el caracter es igual a "," si es asi, lo acumulo. if Caracter = ',' then begin Inc(Item); if Cant = Item then //PARA LIMITAR LA CANTIDAD DE ITEMS POR LINEA begin S := S + Texto +','+ #13; // S := S + Texto +','+ sLineBreak; Texto:= ''; Item := 0; // lo ponemos en cero para volver a contar end else if (Caracter = ',') and (Item < Cant) then Texto:= Texto + ','; //para separar cada item por su delimitador end else // si no voy armando mi texto que desarme ya separado por coma (,) begin Texto:= Texto + Caracter; end; if (I >= LastDelimiter(',',Cadena)) then //si el ultimo delimitador begin S := S + Texto; //DEBO DE QUITAR LA ULTIMA COMA... end; end; 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....
#4
Posted 21 October 2021 - 05:27 PM
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:
//--------------------------------------------------------------------------- // Extrae cadenas separadas por un separador C // Ind es el indice de la cadena a extraer, comenzando por 0 function Split(S: String; Ind: integer; C: CHAR): String; var I, F, N: integer; begin I:= 1; N:= Length(S); while Ind>0 do begin while(I<=N) and (S[i]<>C) do inc(I); inc(I); dec(Ind); end; F:= I; while(F<=N) and (S[F]<>C) do inc(F); Result:= Copy(S, I, F-I); end;
Ahora la función específica para tu caso:
function Divider(S: String; Num: integer; C: CHAR): String; var i: integer; T: String; begin Result:= ''; i:= 1; T:= Trim(Split(S, 0, C)); if(num>0) then while T <> '' do begin Result:= Result + T + C + ' '; if (i mod Num) = 0 then Result:= Result + #13#10; T:= Trim(Split(S, i, C)); inc(i); end; i:= Length(Result); while (i>0) and (Result[i]<>C) do dec(i); Result:= Copy(Result, 1, i-1); 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
#5
Posted 22 October 2021 - 07:03 AM
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.
#6
Posted 22 October 2021 - 10:24 AM
Discúlpame que no etiquete el código, es que no se como hacerlo
En el editor debes seleccionar la etiqueta de código
Saludos.