PDA

Ver la Versión Completa : Eliminar el espacio como delimiter por defecto


egostar
07-08-2008, 14:59:20
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:


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,


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?


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
Hola,
¿este codigo te funciona?


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:

Juan Pérez Martínez;jpm@isp.com;Compañia Universal

Necesito que el otro memo muestre esto:

Juan Pérez Martínez
jpm@isp.com
Compañia Universal
=================

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

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.

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:


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
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

Juan
Pérez;jpm@iSP.com;Av
Conocida
1254;


Salud OS y gracias

egostar
07-08-2008, 16:49:36
Otra forma de como lo puedes hacer es la siguiente:


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
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.


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
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.


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 (http://www.clubdelphi.com/foros/showpost.php?p=160310&postcount=10) para el StringList?

// Saludos

egostar
07-08-2008, 19:41:59
Amigo egostar, ¿qué tu versión de Delphi no cuenta con la propiedad StrictDelimiter (http://www.clubdelphi.com/foros/showpost.php?p=160310&postcount=10) para el StringList?

// Saludos


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
: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
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
Ah bueno, siendo así me siento mejor :)

Salud OS

Si amigo sientate mejor.:D:D:D

tnc
19-07-2014, 08:21:38
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 (http://www.clubdelphi.com/foros/guiaestilo.php)?, gracias por tu colaboración :)

Es de hace 6 años ;)