Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Quitar Vocales repetidas de una Cadena (https://www.clubdelphi.com/foros/showthread.php?t=39186)

Deiv 12-01-2007 16:11:45

Quitar Vocales repetidas de una Cadena
 
Hola,
¿Cuál sería la Función para quitar vocales repetidas (unidas) de una cadena de manera que se convierta en una sola?
Por ejemplo:

'Arribaa en la mooontaña se divisabaa una llama que reecorría su traayectoo'

El resultado debe ser

'Arriba en la montaña se divisaba una llama que recorría su trayecto'

En realidad las consonantes no deben afectarse, solo las vocales repetidas (seguidas).
Pregunto a manera de practicar y saber como aplicarlo para el objetivo que tengo. Ya sé que por ejemplo si se quita a "Coordinado" se vería mal como "Cordinado", pero como dije otro es el objetivo, y me bastará con vuestras orientaciones de las vocales para darme cuenta.
Deiv

Neftali [Germán.Estévez] 12-01-2007 17:11:21

Cita:

Empezado por Deiv
¿Cuál sería la Función para quitar vocales repetidas (unidas) de una cadena de manera que se convierta en una sola?

¿Quieres una orientación? o ¿Quieres que te la demos escrita?

Como orientación yo te diría que realices un recorrido utilizando un FOR, que uses dos variables para almacenar la vocal actual (a) y la vocal anterior (n) y una cadena destino (res); Con un IF dentro para comprobar si (a) es = a (n) y en ese caso la vocal actual no se debe guardar en la cadena destino, en caso contario sí.

seoane 12-01-2007 17:56:51

No es el algoritmo mas eficiente, pero es eficaz :p

Código Delphi [-]
function Reducir(Str: string; C: Char): String;
begin
  while Pos(C+C, Str) > 0 do
    Str:= StringReplace(Str,C+C,C,[rfReplaceAll]);
  Result:= Str;
end;

var
  Vocales: String;
  i: integer;
  Str: String;
begin
  Vocales:= 'aeiouAEIOU';
  Str:= 'Arribaa en la mooontaña se divisabaa una llama que reecorría su traayectoo';
  for i:= 1 to length(Vocales) do
    Str:= Reducir(Str,Vocales[i]);
  ShowMessage(Str);
end;

Deiv 12-01-2007 19:14:42

Gracias Seoane,
Siempre tan gentil, no conocía esa función en Delphi 7.

roman 12-01-2007 19:53:23

Cita:

Empezado por Neftali
¿Quieres una orientación? o ¿Quieres que te la demos escrita?

Creo que ha quedado claro :p

Ñuño Martínez 12-01-2007 20:27:28

Cita:

Empezado por Deiv
Gracias Seoane,
Siempre tan gentil, no conocía esa función en Delphi 7.

No la conocías simplemente porque no existía, hasta que Seoane la escribió.

seoane 12-01-2007 20:52:23

Volviendo a la idea de Neftali, que al contrario que la mía si que era eficiente además de eficaz :p , tendríamos esto otro:

Código Delphi [-]
function Reducir(Str: String): String;
var
  C: Char;
  i: integer;
begin
  C:= #0;
  Result:= EmptyStr;
  for i:= 1 to Length(Str) do
  begin
    if pos(Str[i],'aeiouAEIOU') > 0 then
    begin
      if Str[i] <> C then
        Result:= Result + Str[i];
    end else
      Result:= Result + Str[i];
    C:= Str[i];
  end;
end;

var
  Str: String;
begin
  Str:= 'Arribaa en la mooontaña se divisabaa una llama que reecorría su traayectoo';
  ShowMessage(Reducir(Str));
end;

Deiv 12-01-2007 22:59:38

Gracias Seoane ambas funcionan bien
Cita:

Empezado por Ñuño Martínez
No la conocías simplemente porque no existía, hasta que Seoane la escribió.

EDITO: no conocía la función: StringReplace :p
.

Frankus 28-07-2007 20:24:58

Cadenas Repetidas n SQL 2005
 
Como hago lo mismo pero con sentencias SQL??
Eliminar datos con letras repetidas mas de 5 veces

adfa 30-07-2007 16:40:14

A ver que les parece esta opción
 
Con conjuntos me gusto.

Código Delphi [-]
function TForm1.sacarVocalesRepetidas(texto: string): string;
var
  i: integer;
  vocales: set of char;
  ant: char;
begin
  ant     := #0;
  vocales := ['a', 'e', 'i' ,'o' ,'u','A','E','I','O','U'];
  result  := '';
  for i := 1 to length(texto) do
  begin
    if not (texto[i] in vocales) then
      result := result + texto[i]
      else
      if texto[i] <> ant then result := result + texto[i];
    ant := texto[i];
  end;
end;

Saludos

Frankus 30-07-2007 20:46:36

Sql?
 
Bueno creo q no saben bien sobre SQL... su especialidad es Delphi ya bueno, gracias por todo .. Nos vmos Foro
Cya

adfa 30-07-2007 21:31:04

Cita:

Empezado por Frankus
Bueno creo q no saben bien sobre SQL... su especialidad es Delphi ya bueno, gracias por todo .. Nos vmos Foro
Cya

En mi caso es probable que tengas razón y sepa poco de sql (bueno de Delphi tambien pero en fin...).
Despues que postee me di cuenta que el tema era muy viejo y que vos lo reviviste con lo del sql.

Hasta donde yo se solo con sql no se puede, tendrías que programar un triger en la base de datos o alguna stored procedure en el lenguaje que soporte la base para hacerlo.
Si no tendrías que recorrerte la tabla utilizar alguna función como las que aqui aparecen (o en el lenguaje que uses, porque por tu comentario quiza no sea Delphi) e ir remplazando los campos de texto.

Saludos

Angel Fernández 30-07-2007 22:23:01

Prueba con strman
 
Para hacer casi cualquier cosa con cadenas de texto, te recomiendo que te bajes la unidad strman.pas (en torry la encuentras) y eches un vistazo a la ayuda que trae. Es una utilidad libre y viene con fichero hlp de ayuda.
Concretamente, mira la función replace.
No dejes de mirar las posibilidades de strman. Yo ahora no puedo vivir sin ella.

Espero que te sirva de ayuda.

Un saludo.

Ñuño Martínez 31-07-2007 07:55:25

Cita:

Empezado por Frankus
Como hago lo mismo pero con sentencias SQL??
Eliminar datos con letras repetidas mas de 5 veces

Hasta donde sé, me temo que sólo con SQL no se puede hacer. Tal vez con alguna extensión como PL o así. De cualquier forma siempre puedes comprobar los datos desde Delphi.


La franja horaria es GMT +2. Ahora son las 14:42:19.

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