Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Recorrer un String (https://www.clubdelphi.com/foros/showthread.php?t=64831)

Carmen Flores 22-04-2009 03:15:42

Recorrer un String
 
Hola. Tengo un problema:
Necesito recorrer nombre de archivos como String:
ACA01-05-07-06.doc ó
VA05-06-07-08.PDF
y necesito identificar las primeras letras y enseguida ir formando otro string con las primeras letras más los siguientes dos digitos, ejemplo:

ACA01
ACA05
ACA07
ACA06
VA05
VA06
VA07
VA08

y después de que va separando el string debe hacer un busqueda (función que ya tengo) en una BD.

parte del codigo que estoy utilizando es este:


Funcion para identificar Letras

procedure TMain.OpenArrayLetras(const constArray: array of const);
var
i : Integer;
begin
for i := 0 to 54 {High(constArray)} do
begin
Abcd:=ConstArray[i].VChar;
if Abcd=LetraFile then
break;
end;
end;

Funcion para identificar Numeros
procedure TMain.OpenArrayNumero(const constArray: array of const);

var
i : Integer;
begin
for i := 0 to 9 {High(constArray)} do
begin
ABC123:=ConstArray[i].VChar;
if ABC123=NumFile then
break;
end;
end;



procedure TMain.AdvSmoothButton4Click(Sender: TObject);
var
Letra, numero, Punto: Integer;
Final, FinalNum, Plana, PlanaNum: String;
begin
//Punto:='.';
PkaCmp:='aca01-02-99-16.PDF';
punto:=Pos('.',PkaCmp);
Delete(PkaCmp,Punto,4);
//Delete(PkaCmp,Punto+1,3);

for letra := 1 to Length(PkaCmp) do
begin
LetraFile:=PkaCmp[Letra];
OpenArrayLetras(['a','b','c','d','e','f','g','h','i','j','k','l','m','n','ñ',
'o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H',
'I','J','K','L','M','N','Ñ','O','P','Q','R','S','T','U','V','W','X','Y','Z']);
if not (LetraFile=Abcd) then

Begin
//inicio de busqueda de nomenclatura
Final:=PkaCmp;
Delete(Final, Letra, Length(Final));
Plana:=Final;
NomPub:=Plana;
Memo2.Lines.Add(Plana);
//termino de busqueda de nomenclatura
//inicio de busqueda de dos digitos de la plana
//Se elimina la nomenclatura y se dejan los numeros de página
PkaCmp2:= Copy(PkaCmp,Letra,length(PkaCmp));
for numero := 1 to Length(PkaCmp2) do
Begin
NumFile:=PkaCmp2[Numero];
OpenArrayNumero(['0','1','2','3','4','5','6','7','8','9']);

if Not (NumFile=ABC123) then
Begin
FinalNum:=PkaCmp2;
PlanaNum:= copy(FinalNum, ((numero)-(2)),2 );
Digito:=PlanaNum;
PlanaBusqueda:=NomPub+Digito;
Memo2.Lines.Add(PlanaBusqueda);
end;

end;
end;


end;
end;

Ñuño Martínez 22-04-2009 09:33:18

Dos cosillas: primero, deberías utilizar las etiquetas [code]... [/code] (el botón con el símbolo "#" o uno de los tres siguientes)

Y segundo, ¿cuál es exactamente tu consulta?

alferesvi 22-04-2009 10:28:37

buenas, soy nuevo aqui y haber q tal esta solucion

Código Delphi [-]
 
i:=0;
longitud:=lenght(variablestring);
repeat
   i:=i+1;
   //con esto guardas todas letras hasta que encuentra el signo '-'
   if variablestring[i]<>'-' then nuevastring[i]:=nuevastring[i]+variablestring[i]
   else salida:=false;
until salida;

si hay algun error de codigo perdoneme

Carmen Flores 23-04-2009 01:29:46

Recorrer Sting
 
Hola, creo que no me di entender mucho, pero aquí escribo el código ya corregido y cual es exactamente mi problema:

Gracias y saludos

Código:


//Función para identificar letras
procedure TMain.OpenArrayLetras(const constArray: array of const);
var
  i : Integer;
begin
  for i := 0 to 54 {High(constArray)} do
    begin
      Abcd:=ConstArray[i].VChar;
    if Abcd=LetraFile then
      break;
    end;
end;



//Función para identificar números
procedure TMain.OpenArrayNumero(const constArray: array of const);
var
  i : Integer;
begin
  for i := 0 to 9 {High(constArray)} do
    begin
      ABC123:=ConstArray[i].VChar;
    if ABC123=NumFile then
      break;
    end;
end;


//Procedimiento (dentro de un botón)
procedure TMain.AdvSmoothButton4Click(Sender: TObject);
var
Letra, numero, Punto: Integer;
Final, FinalNum, Plana, PlanaNum, PkaCmp, PkaCmp2, PkaCmp3: String;
begin

//String que quiero leer. que puede ser de dos o tres letras
//y de dos o cuatro pares de números:
// 've56-21.doc' o 'jun01-06-82-11.pdf'

PkaCmp:='aca01-02-99-16.PDF';

// al string le eliminamos la extensión y nos queda el string asi:
// 'aca01-02-69--99-16'

punto:=Pos('.',PkaCmp);
Delete(PkaCmp,Punto,4);

//se inicia el recorrido del string (PkaCmp) para buscar letras

for letra := 1 to Length(PkaCmp) do
        begin
  LetraFile:=PkaCmp[Letra];
  OpenArrayLetras(['a','b','c','d','e','f','g','h','i','j','k','l','m','n','ñ',
'o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H',
'I','J','K','L','M','N','Ñ','O','P','Q','R','S','T','U','V','W','X','Y','Z']);
              if not (LetraFile=Abcd) then
                Begin
              //inicio de busqueda de nomenclatura
                Final:=PkaCmp;
                Delete(Final, Letra, Length(Final));
                Plana:=Final;
//este es es resultado de las dos o tres primeras letras de string

                NomPub:=Plana;

                Memo2.Lines.Add(Plana);

//termina el recorrido del string (PkaCmp) y nos encontramos dos o tres letras             

//inicio de busqueda de dos digitos de la plana

              //Se elimina la nomenclatura y se dejan los numeros de página
                PkaCmp2:=  Copy(PkaCmp,Letra,length(PkaCmp));

            for numero := 1 to Length(PkaCmp2) do
                    Begin
                    NumFile:=PkaCmp2[Numero];
                    OpenArrayNumero(['0','1','2','3','4','5','6','7','8','9']);

                  if Not (NumFile=ABC123) then
                      Begin
                      FinalNum:=PkaCmp2;
                      PlanaNum:= copy(FinalNum, ((numero)-(2)),2 );

//este es el resultado de los primeros dos digitos del string

                      Digito:=PlanaNum;

//en el primer recorrido ya tengo mi primer string (PkaCmp:='aca01')
//y junto mus letras + mi primer digito y realizo una búsqueda
//es donde tengo mi problema, si hago la busqueda de los primeros
// tres digitos:'aca01' 'aca02' 'aca99' y el cuarto ya no lo hace

                      PlanaBusqueda:=NomPub+Digito;

                      Memo2.Lines.Add(PlanaBusqueda);
                      end;

                    end;
              end;


        end;
end;


roman 23-04-2009 03:01:05

A ver, o no entiendo lo que quieres hacer o está muy complicado el método que usas.

Voy a partir de esto que pones en tu código:

Cita:

//String que quiero leer. que puede ser de dos o tres letras
//y de dos o cuatro pares de números:
// 've56-21.doc' o 'jun01-06-82-11.pdf'
y de las cadenas resultantes en el ejemplo que pusiste en tu primer mensaje.

La idea es:

1. Quitar la extensión
2. Separar la parte de las letras y la parte con la secuencia numérica.
3. Por cada número en la secuencia, formar una cadena compuesta por las letras y el número.

La primera parte es muy sencilla usando la función ChangeFileExt.

Para la segunda parte, si -como mencionas en el comentario- la cadena sólo puede contener dos o tres letras, entonces basta leer el tercer caracter para saber cuántas letras tenemos. Si es un número, quiere decir que sólo hay dos letras, y en caso contrario tres. Una vez determinado esto, es fácil separar las letras con la función Copy y, así mismo, la secuencia de números como 01-06-82-11.

Ahora bien, esta secuencia consiste de números separados por un guíon. Así que, para aislar cada número, viene muy práctico el uso de un TStringList y su propiedad DelimitedText.

Una vez que tengamos en una lista los distintos números, ya sólo es cosa de recorrer dicha lista y concatenar las letras con el número en turno.

Aquí pongo la expresión de mi idea:

Código Delphi [-]
procedure SplitString(S: String; Strings: TStrings);
var
  Letras: string; // Parte de las letras
  Cantidad: Integer; // Cantidad de letras
  Numeros: TStringList; // Lista de números
  I: Integer;

begin
  // Eliminamos la extensión
  S := ChangeFileExt(S, '');

  // Determinamos la cantidad de letras según lo que haya en el tercer caracter
  if ( S[3] in ['0'..'9'] ) then
    Cantidad := 2
  else
    Cantidad := 3;

  // Separar las letras
  Letras := Copy(S, 1, Cantidad);

  Numeros := TStringList.Create;
  try
    // Separamos los números y los ponemos en una lista
    Numeros.Delimiter := '-';
    Numeros.DelimitedText := Copy(S, Cantidad + 1, MaxInt);

    for I := 0 to Numeros.Count - 1 do
      Strings.Add(Letras + Numeros[i]);
  finally
    Numeros.Free;
  end;
end;

La forma de usar este procedimiento sería así, por ejemplo, para poner las cadenas resultantes en un Memo:

Código Delphi [-]
SplitString('jun01-06-82-11.pdf', Memo1.Lines);

// Saludos


La franja horaria es GMT +2. Ahora son las 00:58:58.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi