Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Eliminar el espacio como delimiter por defecto (https://www.clubdelphi.com/foros/showthread.php?t=58964)

egostar 07-08-2008 14:59:20

Eliminar el espacio como delimiter por defecto
 
Hola

Tengo un pequeño detalle, buscando por aquí y por allá vi que se puede cargar un TStringList con valores obtenidos desde un archivo de texto, hasta aquí todo bien, uso las propiedades Delimiter y DelimitedText de esta forma:

Código Delphi [-]
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  i: Integer;
  Linea: string;
begin
  DoubleBuffered := True;
  Memo1.Lines.LoadFromFile('C:\Desarrollo\TDelphi\SGP\Documentos\Base.csv');
  for i := 0 to Memo1.Lines.Count - 1 do begin
      Linea := Memo1.Lines[i];
      Linea := StringReplace(Linea,#9,' ',[rfReplaceAll]); //Quito los caracteres Tab que no me sirven,
      Memo2.Lines.Delimiter := ';'; //Asigno punto y coma como delimiter
      Memo2.Lines.DelimitedText := Linea; //Agrego la Linea al Memo
      Memo2.Lines.Add('==========================');
  end;
end;

Ok, hasta aquí todo aparenta funcionar como debe ser, pero..... (como siempre hay un pero) sigue tomando el espacio como un delimiter, que por lo que he leído es el que traen por defecto.

Bueno, después de todo este rollo mareador, la pregunta que quiero hacer. :)

¿Hay manera de eliminar el espacio como delimiter?

Yo lo he resuelto cambiando el espacio por un guion bajo,

Código Delphi [-]
      Linea := StringReplace(Linea,' ','_',[rfReplaceAll]);

Pero no es lo que necesito.

Salud OS y gracias.

coso 07-08-2008 15:46:23

Hola,
¿este codigo te funciona?

Código Delphi [-]
procedure TForm1.BitBtn1Click(Sender: TObject);
var
   i: Integer;
   Linea: string;
begin
   DoubleBuffered := true;
   Memo1.Lines.LoadFromFile('...');
   Memo1.Lines.text := stringreplace(Memo1.Lines.text,#9,' ',[rfReplaceAll]);
   Memo2.Lines.Delimitier := ';';
   Memo2.Lines.Delimitiedtext := Memo1.Lines.Text;
end;

coso 07-08-2008 15:48:03

y remirando...no deberia ser antes de cargar el fichero memo1.lines.delimitier:= ';'?

egostar 07-08-2008 15:53:49

Cita:

Empezado por coso (Mensaje 306346)
Hola,
¿este codigo te funciona?

Código Delphi [-]
procedure TForm1.BitBtn1Click(Sender: TObject);
var
   i: Integer;
   Linea: string;
begin
   DoubleBuffered := true;
   Memo1.Lines.LoadFromFile('...');
   Memo1.Lines.text := stringreplace(Memo1.Lines.text,#9,' ',[rfReplaceAll]);
   Memo2.Delimitier := ';';
   Memo2.Lines.Delimitiedtext := Memo1.Lines.Text;
end;

Hola coso,

Si gracias, esa es la forma simplificada de hacerlo, sin embargo en este caso necesito mostrar la información tal y como lo tiene el archivo y después hacer un listado con datos del mismo archivo, el tema es que necesito que el espacio no lo considere como delimiter por ejemplo

El Archivo tiene esta estructura:

Cita:

Juan Pérez Martínez;jpm@isp.com;Compañia Universal
Necesito que el otro memo muestre esto:

Cita:

Juan Pérez Martínez
jpm@isp.com
Compañia Universal
=================
Pero como está tomando el caracter espacio como delimiter, me hace esto

Cita:

Juan
Pérez
Martínez
jpm@isp.com
Compañia
Universal
=================
Yo estoy cambiando el espacio por un guion bajo, pero no es lo que necesito.

Cita:

Juan_Pérez_Martínez
jpm@isp.com
Compañia_Universal
=================
Espero haber sido más claro.

Salud OS

coso 07-08-2008 16:09:48

Y, como te decia, ¿poniendo memo1.lines.delimitier := ';' antes de cargar el archivo? en teoria te lo tendria que cargar considerando como delimitador ese, a no ser que haya alguna otra variable.

jhonny 07-08-2008 16:19:58

Otra forma de como lo puedes hacer es la siguiente:

Código Delphi [-]
 
procedure TForm2.Button1Click(Sender: TObject);
var
  Linea: String;
begin
  Memo1.Lines.LoadFromFile('C:\Desarrollo\TDelphi\SGP\Documentos\Base.csv');
  Memo2.Clear;
  for Linea in Memo1.Lines do
  begin
    ExtractStrings([';'], [' '], PCHAR(Linea+';'+StringOfChar('=', 17)), Memo2.Lines);
  end;
end;

egostar 07-08-2008 16:46:06

Cita:

Empezado por coso (Mensaje 306354)
Y, como te decia, ¿poniendo memo1.lines.delimitier := ';' antes de cargar el archivo? en teoria te lo tendria que cargar considerando como delimitador ese, a no ser que haya alguna otra variable.

Hola haciendo lo que comentas me resulta esto

Cita:

Juan
Pérez;jpm@iSP.com;Av
Conocida
1254;
Salud OS y gracias

egostar 07-08-2008 16:49:36

Cita:

Empezado por jhonny (Mensaje 306357)
Otra forma de como lo puedes hacer es la siguiente:

Código Delphi [-]
 
procedure TForm2.Button1Click(Sender: TObject);
var
  Linea: String;
begin
  Memo1.Lines.LoadFromFile('C:\Desarrollo\TDelphi\SGP\Documentos\Base.csv');
  Memo2.Clear;
  for Linea in Memo1.Lines do
  begin
    ExtractStrings([';'], [' '], PCHAR(Linea+';'+StringOfChar('=', 17)), Memo2.Lines);
  end;
end;

Hey, eres mi héroe amigo jhonny, funciona perfecto, te debo una :D

No entiendo como funciona eso que hiciste :o, pero lo voy a analizar, esta muy interesante :)

Salud OS

JoseFco 07-08-2008 16:52:26

Cita:

Empezado por egostar (Mensaje 306349)
Hola coso,

Si gracias, esa es la forma simplificada de hacerlo, sin embargo en este caso necesito mostrar la información tal y como lo tiene el archivo y después hacer un listado con datos del mismo archivo, el tema es que necesito que el espacio no lo considere como delimiter por ejemplo

El Archivo tiene esta estructura:


Necesito que el otro memo muestre esto:


Pero como está tomando el caracter espacio como delimiter, me hace esto



Yo estoy cambiando el espacio por un guion bajo, pero no es lo que necesito.


Espero haber sido más claro.

Salud OS

Eso se resuelve con un caracter ascii invicible.:D

Caro 07-08-2008 16:57:18

Hola egopolice, que yo sepa es así como funciona, la forma que se me ocurre para que te separe tomando en cuenta los espacios es utilizando QuoteChar.

Código Delphi [-]
  StringList.QuoteChar := ';';
  StringList.Delimiter := ' ';
  StringList.DelimitedText := ';Juan Pérez Martínez; ;jpm@isp.com; ;Compañia Universal;';

tu cadena tendría que estar de esa forma, egopolice sería mejor que reemplaces por la _ como lo estabas haciendo y despues esa _ por un espacio. O buscar otra forma sin usar Delimiter y DelimiterText.

Saluditos

egostar 07-08-2008 17:04:53

Cita:

Empezado por Caro (Mensaje 306372)
Hola egopolice, que yo sepa es así como funciona, la forma que se me ocurre para que te separe tomando en cuenta los espacios es utilizando QuoteChar.

Código Delphi [-]
  StringList.QuoteChar := ';';
  StringList.Delimiter := ' ';
  StringList.DelimitedText := ';Juan Pérez Martínez; ;jpm@isp.com; ;Compañia Universal;';

tu cadena tendría que estar de esa forma, egopolice sería mejor que reemplaces por la _ como lo estabas haciendo y despues esa _ por un espacio. O buscar otra forma sin usar Delimiter y DelimiterText.

Saluditos

Hola amiguita Caro, si, de hecho yo tenia esa opción, pero la verdad es que trataba de simplificar el código, digo, con Delphi puedes hacer todo lo que necesitas y mas :), solo que no nos sabemos todas sus bondades, con el código que posteo jhonny funciona tal y como lo soñe y con menos lineas de las que estaba haciendo, quiero decir, se cumplieron dos objetivos, simplificar el código y lograr el resultado esperado :)

Salud OS

roman 07-08-2008 19:35:13

Amigo egostar, ¿qué tu versión de Delphi no cuenta con la propiedad StrictDelimiter para el StringList?

// Saludos

egostar 07-08-2008 19:41:59

Cita:

Empezado por roman (Mensaje 306406)
Amigo egostar, ¿qué tu versión de Delphi no cuenta con la propiedad StrictDelimiter para el StringList?

// Saludos

Cita:

Empezado por RTFH
Description

Use this property to specify whether the Delimiter is the only value used within the DelimitedText property. If set to True, individual strings in DelimitedText are separated only by the character that is the value of Delimiter. If set to False, individual strings in DelimitedText can be separated by a space, a non-printable character, or the character that is the value of Delimiter.

:o

Salud OS

seoane 07-08-2008 23:20:59

:D En defensa de egostar hay que decir que la propiedad StrictDelimiter es relativamente reciente. Yo la vi por primera vez en el turbo, en delphi 7 no existía

egostar 08-08-2008 00:20:44

Cita:

Empezado por seoane (Mensaje 306448)
:D En defensa de egostar hay que decir que la propiedad StrictDelimiter es relativamente reciente. Yo la vi por primera vez en el turbo, en delphi 7 no existía

Gracias amigo seoane por esa defensa a mi orgullo herido :( :)

Salud OS

roman 08-08-2008 01:30:49

Oigan, yo no lo decía con ánimo de herir orgullos eh? Por eso cité el mensaje de Seoane, dónde queda claro que yo tampoco sabía de esa propiedad :)

// Saludos

egostar 08-08-2008 01:46:54

Cita:

Empezado por roman (Mensaje 306460)
Oigan, yo no lo decía con ánimo de herir orgullos eh? Por eso cité el mensaje de Seoane, dónde queda claro que yo tampoco sabía de esa propiedad :)

// Saludos

Ah bueno, siendo así me siento mejor :)

Salud OS

JoseFco 08-08-2008 02:34:35

Cita:

Empezado por egostar (Mensaje 306461)
Ah bueno, siendo así me siento mejor :)

Salud OS

Si amigo sientate mejor.:D:D:D

tnc 19-07-2014 08:21:38

funciona perfecto
 
Cita:
Empezado por roman Ver Mensaje
Amigo egostar, ¿qué tu versión de Delphi no cuenta con la propiedad StrictDelimiter para el StringList?

// Saludos

yo tenia el mismo problema, quería que los espacios no se tomaran como delimitador excelente comentario roman gracias

Casimiro Notevi 19-07-2014 12:31:20

Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración :)

Es de hace 6 años ;)


La franja horaria es GMT +2. Ahora son las 18:46:42.

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