PDA

Ver la Versión Completa : ¿Como extraer letras de una cadena?


avila
21-07-2011, 04:23:35
Hola a todos. ¿Cómo puedo extraer una serie de letras que estan en una cadena separadas por comas ','.

Tengo este String 'abc,134,jio', necesito sacar las frases abc a una variable y tambien los números asi como los últimos caracteres. ¿Alguna idea?

marcoszorrilla
21-07-2011, 06:36:47
MiCadena1:=Copy('abc,134,jio',1,3);
MiCadena2:=Copy('abc,134,jio',5,3);

Un Saludo.

oscarac
21-07-2011, 06:44:08
Si las posiciones son fijas entonces podrias hacerlo como bien te menciona marcoszorrilla, pero si son variables y delimitadas por "," entonces tendrias que hacerte un procedimiento que lea la cadena y vaya asignando cada vez que encuentre una coma ","

Algo Asi


for i:= 1 to Length(sLinea) do
begin
vChar := Copy(sLinea, i, 1);
if vChar = ',' then
begin
Inc(vContador);
case vContador of
1: begin CDSCCostoCCosto.Value := vCadena; vCadena:= ''; end;
2: begin CDSCCostoDescripcion.Value := vCadena; vCadena:= ''; end;
end
End
Else
vCadena := vCadena + vChar;


vContador te indica el bloque que esta leyendo.. en el ejemplo solo hay 2 bloques

cecam
21-07-2011, 08:48:18
O también usar un TStringList y mirarte las propiedades Delimiter y DelimitedText

Saludos!

newtron
21-07-2011, 08:59:01
Hola.

Echale un vistazo a esta respuesta del maestro ecfisa.

http://www.clubdelphi.com/foros/showthread.php?t=74871

Saludos

avila
22-07-2011, 05:12:59
Muchisimas gracias por las sugerencias, en verdad me pondre a trabajar, no sin antes compartirles que hice dos funciones para obtener lo que quiero, díganme como mejorarlo o dejarlo en una sola función.

ya un poco acorralado se me ocurrio hacer una función para extraer los caracteres y otra para elimanrlos. ¿Qué les parece?


function ExtraeChars(Linea:String):String;
var i,j : integer;
begin
for i := 1 to length(Linea) do
begin
j:= Pos(',',Linea);
end;
ExtraeChars:=copy(Linea,1,j-1);
end;

function EliminaChars(Linea:String):String;
var i,j : Integer;
begin
for i := 1 to length(Linea) do
begin
j:= Pos(',',Linea);
end;
Delete(Linea,1,j);
EliminaChars:=Linea;
end;

procedure TForm2.Button1Click(Sender: TObject);
var Cadena,Result1,Result2: string;
begin
Cadena:='Club,Delphi';
Result1:=ExtraeChars(Cadena);
Cadena :=EliminaChars(Cadena);
Result2:=Cadena;
ShowMessage(Result1);
ShowMessage(Result2);
end;

oscarac
22-07-2011, 05:48:30
pues eso depende del uso que le quieras dar a las funciones que has creado

ecfisa
22-07-2011, 06:04:52
Hola avila.

Tus funciones son correctas, pero usando TStringLists podés hacerlo de forma simple en una sóla función:

function SepararCadena(const Cadena: string; const Delim: Char): TStringList;
begin
Result:= TStringList.Create;
Result.Delimiter:= Delim;
Result.DelimitedText:= Cadena;
end;


Ejemplos de llamada:

procedure TForm1.Button1Click(Sender: TObject);
var
TS: TStrings;
i : integer;
begin
TS:= SepararCadena('Cadena1,Cadena2,Cadena3,...,CadenaN',',');
try
for i:= 0 to TS.Count -1 do
ShowMessage(TS[i]);
finally
TS.Free;
end;
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Items:= SepararCadena('Cadena1,Cadena2,Cadena3,...,CadenaN',',');
end;


Saludos.

avila
22-07-2011, 06:27:14
Muchisimas Gracias a MarcosZorrilla, Oscarac, Newtron y Ecfisa. Tomare muy en cuenta los TStringLists. El código de Oscar esta muy bueno. Hare las pruebas y regresare a compartir con ustedes como me fue. Seguimos en contacto y muchos saludos.

ContraVeneno
22-07-2011, 17:42:29
¿Cómo separar una cadena a un arreglo de valores? Artículo en Delphi.About.com en ingles. (http://delphi.about.com/cs/adptips2002/a/bltip1102_5.htm)

Es un ejemplo bien simple y te coloca los valores en un arreglo y ya podrías manejar cada uno a tu antojo. Se puede utilizar cualquier delimitador.
Aunque el ejemplo de eficsa me parece mucho más sencillo, de cualquier forma quería enlazar el otro para tener opciones.