Copiar string dentro de outra string
Pessoal, preciso de uma função que copia uma string dentro de outra, mas com uma particularidade, pode acontecer mais de uma ocorrência
Seria assim
tenho uma string com alguns códigos, separados por ponto e virgula e espaço, sem limite de caracteres.
SCOROO, INTE, CABOCLO, ESOM, INTE, EDUCACAO, BOTICA, COSTAS, 0038, LUCR, INTE, CHEVE, ESPELHO, TODO, BETH, FEVA,
Reparem que o código " INTE'" aparece 3 vezes
Quero percorrer essa string e se encontrar o código INTE, continuar até o fim para saber se tem mais ocorrência.
Obrigado
Seria assim
tenho uma string com alguns códigos, separados por ponto e virgula e espaço, sem limite de caracteres.
SCOROO, INTE, CABOCLO, ESOM, INTE, EDUCACAO, BOTICA, COSTAS, 0038, LUCR, INTE, CHEVE, ESPELHO, TODO, BETH, FEVA,
Reparem que o código " INTE'" aparece 3 vezes
Quero percorrer essa string e se encontrar o código INTE, continuar até o fim para saber se tem mais ocorrência.
Obrigado
Pedro Vieira
Curtidas 0
Respostas
Thiago Irrazabal
30/10/2013
Boa tarde segue um código para contar quantas "ocorrências" existem em uma determinada frase.
Declare em public ou private da tua unit isso:
CTRL + SHIFT + C pra ele criar, e substitui do begin até o end por isso:
Depois a chamada do código fica assim:
Lembrando que é só passar no primeiro parâmetro a "Frase" e no segundo o que tu quer que ele ache, ele vai contar quantos tem dentro da frase e te retornar um numero, espero ter ajudado.
Att,
Thiago Irrazabal de Oliveira.
Declare em public ou private da tua unit isso:
function ContaOcorrencias(S, Ocorrencia: string): Integer;
CTRL + SHIFT + C pra ele criar, e substitui do begin até o end por isso:
var
Cont: Integer;
begin
Cont := 0;
while Pos(Ocorrencia, S) > 0 do
begin
S := Copy(S, Pos(Ocorrencia, S) + Length(Ocorrencia), Length(S));
Inc(Cont);
end;
Result := Cont;
end;
Depois a chamada do código fica assim:
Variavel := ContaOcorrencias('SCOROO, INTE, CABOCLO, ESOM, INTE, EDUCACAO, BOTICA, COSTAS, 0038, LUCR, INTE, CHEVE, ESPELHO', 'INTE');
Lembrando que é só passar no primeiro parâmetro a "Frase" e no segundo o que tu quer que ele ache, ele vai contar quantos tem dentro da frase e te retornar um numero, espero ter ajudado.
Att,
Thiago Irrazabal de Oliveira.
GOSTEI 0
Pedro Vieira
30/10/2013
Obrigado Thiago, mas preciso percorrer a string usando a virgula como separador, tipo quebrar a string quando encontrar uma virgula e copiar os caracteres até encontrar outra virgula... entendeu?
Mais uma vez obrigado pela atenção...
Mais uma vez obrigado pela atenção...
GOSTEI 0
Thiago Irrazabal
30/10/2013
Obrigado Thiago, mas preciso percorrer a string usando a virgula como separador, tipo quebrar a string quando encontrar uma virgula e copiar os caracteres até encontrar outra virgula... entendeu?
Mais uma vez obrigado pela atenção...
Mais uma vez obrigado pela atenção...
Beleza, faz assim então, deixa essa função que eu te passei e vamos criar uma outra que vai precisar daquela.
Declara essas 2 coisas no private da tua unit:
Aux: array of string; Cont: Integer;
Depois a procedure:
procedure SeparaPalavras(Palavra: String);
Substitui do begin ao end por isso aqui:
var
I: Integer;
begin
for I := 0 to Cont - 1 do
begin
if Pos(',', Palavra) > 0 then
begin
Aux[I] := Copy(Palavra, 1, Pos(',', Palavra) - 1);
Palavra := Copy(Palavra, Pos(',', Palavra) + 1, Length(Palavra));
ShowMessage(Aux[I]);
end
else
begin
Aux[I] := Palavra;
Palavra := '';
ShowMessage(Aux[I]);
end;
end;
end;
Lembrando que o array Aux é quem vai guardar cada palavra... e aqui o "ShowMessage" é só para mostrar as palavras separadas.
Depois as chamadas dos códigos ficam assim:
Cont := ContaOcorrencias('SCOROO, INTE, CABOCLO, ESOM, INTE, EDUCACAO, BOTICA, COSTAS, 0038, LUCR, INTE, CHEVE, ESPELHO', ',') + 1;
SetLength(Aux, Cont);
SeparaPalavras('SCOROO, INTE, CABOCLO, ESOM, INTE, EDUCACAO, BOTICA, COSTAS, 0038, LUCR, INTE, CHEVE, ESPELHO');
Att,
Thiago Irrazabal de Oliveira.
GOSTEI 0
Pedro Vieira
30/10/2013
Valeu colega, era tudo que eu precisava....
Abs
Abs
GOSTEI 0
Pedro Vieira
30/10/2013
Amigo mudei se código de procedure para function assim:
coloquei em um botao assim
Mas não recebo nada no result.
Voce sabe o porque isso acontece?
Function SeparaPalavras(Palavra: String): String;
var I: Integer;
begin
for I := 0 to Cont - 1 do
begin
if Pos(',', Palavra) > 0 then
begin
Aux[I] := Copy(Palavra, 1, Pos(',', Palavra) - 1);
Palavra := Copy(Palavra, Pos(',', Palavra) + 1, Length(Palavra));
result:= Aux[I];
end
else
begin
Aux[I] := Palavra;
Palavra := '';
result:= Aux[I];
end;
end;
end;
coloquei em um botao assim
s:= minha string showmessage(SeparaHorarios(S,','));
Mas não recebo nada no result.
Voce sabe o porque isso acontece?
GOSTEI 0
Thiago Irrazabal
30/10/2013
Boa tarde, no onclick do botão ele ta chamando outra função? não entendi muito bem, preciso que tu cole todas functions envolvidas para analisá-las.
Att,
Thiago Irrazabal de Oliveira.
Att,
Thiago Irrazabal de Oliveira.
GOSTEI 0
Pedro Vieira
30/10/2013
Estou usando da mesma maneira que vc me passou, apenas mudei de procedure para function
Abs
S recebe minha string; Cont := ContaOcorrencias(S, ',') + 1; SetLength(Aux, Cont); showmessage(SeparaPalavras(S,','));
Abs
GOSTEI 0
Thiago Irrazabal
30/10/2013
Muda a chamada da função para isso:
Depois mude a função para isso e veja se funciona.
Att,
Thiago Irrazabal de Oliveira.
function SeparaPalavras(Palavra: String; S: String = ','): String;
Depois mude a função para isso e veja se funciona.
Function SeparaPalavras(Palavra, S: String): String;
var I: Integer;
begin
for I := 0 to Cont - 1 do
begin
if Pos(S, Palavra) > 0 then
begin
Aux[I] := Copy(Palavra, 1, Pos(S, Palavra) - 1);
Palavra := Copy(Palavra, Pos(S, Palavra) + 1, Length(Palavra));
result:= Aux[I];
end
else
begin
Aux[I] := Palavra;
Palavra := '';
result:= Aux[I];
end;
end;
end;
Att,
Thiago Irrazabal de Oliveira.
GOSTEI 0
Deivison Melo
30/10/2013
Verifique com o comando POS.
Exemplo:
[url]http://delphi.about.com/od/beginners/l/blrtlPos.htm[/url]
Abração e bons códigos!!
Exemplo:
[url]http://delphi.about.com/od/beginners/l/blrtlPos.htm[/url]
Abração e bons códigos!!
GOSTEI 0
Pedro Vieira
30/10/2013
Mudei e não funcionou, retorna uma mensagem vazia..
Abs
Abs
GOSTEI 0
Thiago Irrazabal
30/10/2013
Sim, testei aqui cometi uma "gafe" não irá funcionar assim... já te passo o código corrigido.
Att,
Thiago Irrazabal de Oliveira.
Att,
Thiago Irrazabal de Oliveira.
GOSTEI 0
Pedro Vieira
30/10/2013
na verdade abro um arquivo texto e vou buscando linha a linha os codigos que sao separados por virgula e espaço
Att
AssignFile(F,meuarquivo);
// inicializa para leitura
Reset(F);
while not EOF(F) do
begin
// lê a linha
ReadLn(F,linha);
S:= AnsiUpperCase(linha);
Cont := ContaOcorrencias(S, ',') + 1;
SetLength(Aux, Cont);
showmessage(SeparaPalavras(S ',','));
end;
CloseFile(F);
Att
GOSTEI 0
Thiago Irrazabal
30/10/2013
Modifiquei todo ele pra "adaptar" como função porem não achei útil, eu deixaria como procedure e daria o ShowMessage lá dentro, mas como o programa é teu ai vai o código.
Primeiro tu vai criar um "Objeto", sabe onde declara? depois de Type:
Dai tu vai declarar essas 2 coisas no private, tira o Aux: Array of string; lá do private:
Depois declara a function:
Depois substitui por isso:
As chamadas de códigos ficaram assim:
Att,
Thiago Irrazabal de Oliveira.
Primeiro tu vai criar um "Objeto", sabe onde declara? depois de Type:
TArrayString = record
S: array of string;
end;
Dai tu vai declarar essas 2 coisas no private, tira o Aux: Array of string; lá do private:
Palavra: array of string; Cont: Integer;
Depois declara a function:
function SeparaPalavras(Palavra: String; S: String = ','): TArrayString;
Depois substitui por isso:
var
I: Integer;
Aux: array of string;
begin
SetLength(Result.S, Cont);
SetLength(Aux, Cont);
for I := 0 to Cont - 1 do
begin
if Pos(S, Palavra) > 0 then
begin
Aux[I] := Copy(Palavra, 1, Pos(S, Palavra) - 1);
Palavra := Copy(Palavra, Pos(S, Palavra) + 1, Length(Palavra));
Result.S[I] := Aux[I];
end
else
begin
Aux[I] := Palavra;
Palavra := '';
Result.S[I] := Aux[I];
end;
end;
end;
As chamadas de códigos ficaram assim:
Cont := ContaOcorrencias(S, ',') + 1;
SetLength(Palavra, Cont);
TArrayString(Palavra) := TArrayString(SeparaPalavras(S, ','));
for I := 0 to Cont - 1 do
ShowMessage(Palavra[I]);
Att,
Thiago Irrazabal de Oliveira.
GOSTEI 0
Pedro Vieira
30/10/2013
Na verdade preciso receber o resultado e comparar com uma string.
tipo :
Assim vai funcionar?
tipo :
if resultado da busca = meu código begin
end;
Assim vai funcionar?
GOSTEI 0
Thiago Irrazabal
30/10/2013
Na verdade preciso receber o resultado e comparar com uma string.
tipo :
Assim vai funcionar?
tipo :
if resultado da busca = meu código begin
end;
Assim vai funcionar?
Vai mas tem que ser dentro do FOR
for I := 0 to Cont - 1 do
if Trim(Palavra[I]) = teu código then
//O RESTO DO CÓDIGO
Lembrando que o Trim eu coloquei porque ele está deixando um espaço na frente das palavras, para corrigir isso pode mudar na função também, dai não será necessário colocar o Trim no IF.
var
I: Integer;
Aux: array of string;
begin
SetLength(Result.S, Cont);
SetLength(Aux, Cont);
for I := 0 to Cont - 1 do
begin
if Pos(S, Palavra) > 0 then
begin
Aux[I] := Trim(Copy(Palavra, 1, Pos(S, Palavra) - 1));
Palavra := Copy(Palavra, Pos(S, Palavra) + 1, Length(Palavra));
Result.S[I] := Aux[I];
end
else
begin
Aux[I] := Trim(Palavra);
Palavra := '';
Result.S[I] := Aux[I];
end;
end;
end;
Att,
Thiago Irrazabal de Oliveira.
GOSTEI 0
Thiago Irrazabal
30/10/2013
Pensando bem esse array auxiliar é inútil, podemos tirar ele fora.
Att,
Thiago Irrazabal de Oliveira.
var
I: Integer;
begin
SetLength(Result.S, Cont);
for I := 0 to Cont - 1 do
begin
if Pos(S, Palavra) > 0 then
begin
Result.S[I] := Trim(Copy(Palavra, 1, Pos(S, Palavra) - 1));
Palavra := Copy(Palavra, Pos(S, Palavra) + 1, Length(Palavra));
end
else
begin
Result.S[I] := Trim(Palavra);
Palavra := '';
end;
end;
end;
Att,
Thiago Irrazabal de Oliveira.
GOSTEI 0
Pedro Vieira
30/10/2013
Só posso dizer DEUS LHE PAGUE....
Valeu funcionou 100%,
Abs
Valeu funcionou 100%,
Abs
GOSTEI 0
Thiago Irrazabal
30/10/2013
Disponha, qualquer dúvida estamos aí, abraço.
Att,
Thiago Irrazabal de Oliveira.
Att,
Thiago Irrazabal de Oliveira.
GOSTEI 0