PDA

Ver la Versión Completa : Uso del TStringList.Delimiter/DelimitedText


Walterdf
28-01-2008, 15:26:28
Buenas a todos!

Estoy intentando leer un txt para pasarlo a db. Utilizo TStringlist para cargar el archivo que está delimitado por punto y coma. Especifico el Delimiter como ';' pero no me está trayendo la información de manera correcta. Cuando encuentra un espacio tambien lo toma como separador. Probé cambiar el formato del txt estableciendo el delimitador como tabulación y sucede lo mismo.
Doy un ejemplo de 1 línea del archivo txt:

TRANSMISION - DIRECCION - CAJA;ANILLOS DE SINCRONIZADO;ROT;030001;CHEVROLET;CAJA FAE 1RA.;8,92;5.752.540;;;;;;;;;;;;;;;;30001,00

y lo leo en un procedimiento de esta manera:

var
TXTFile, fields: TStringList;
i: Integer;
begin
TXTFile := TStringList.Create;
fields := TStringList.Create;
try
TXTFile.LoadFromFile('autoparts.txt');
for i := 0 to TXTFile.Count - 1 do
begin
fields.Clear;
fields.Delimiter := ';';
fields.QuoteChar := '';
fields.DelimitedText := CSVFile[i];

//...demás código para realizar la inserción



Hasta aquí si veo el contenido de fields, sería:
fields[0] : TRANSMISION
fields[1] : -
fields[2] : DIRECCION
fields[3] : -
fields[4] : CAJA
...
y debería ser:
fields[0] : TRANSMISION - DIRECCION - CAJA
fields[1] : ANILLOS DE SINCRONIZADO
fields[2] : ROT
fields[3] : 030001
fields[4] : CHEVROLET
...

Qué estoy haciendo mal?

Desde ya agradezco a quien pueda darme una mano.
Saludos!!

Mick
28-01-2008, 19:13:26
No se si ha sido un fallo de transcripcion o realmente en el codigo fuente original esta asi pero esta linea:

fields.DelimitedText := CSVFile[i];

deberia ser

fields.DelimitedText := TXTFile[i];


CSVFile es una variable que no aparece por ningun lado en tu ejemplo salvo ahi !!!!.


Saludos

Walterdf
28-01-2008, 19:23:46
Fue solo un error de transcripción.

De todas maneras muchas gracias Mick!!!

Un abrazo

seoane
28-01-2008, 20:46:39
En las versiones antiguas de delphi, la Clase TStringList toma como separador, además del que se indica con la propiedad Delimiter, todos los caracteres iguales o inferiores a #32 (el espacio), es decir que los espacios, tabuladores y demás siempre serán utilizados como separadores.

Esto era una característica bastante molesta, que además no tiene ninguna explicación, solo que a los programadores de delphi les pareció buena idea. Menos mal que en las nuevas versiones la clase TStringList cuenta con la propiedad StrictDelimiter, que cuando esta a TRUE fuerza a que solo el carácter indicado por la propiedad Delimiter sea tomado como un separador. Al menos así es al menos en mi versión de Turbo delphi, por lo que supongo que en delphi 2007, y puede que en 2006, ocurrirá lo mismo.

Walterdf
28-01-2008, 21:09:17
Vaya problema!
Pensé que estaba metiendo la pata!!, le di vueltas y vueltas al problema y nada...

Muchas gracias seoane por desasnarme!!!!

Veremos como lo solucionamos.

Un abrazo a todos y gracias nuevamente!!!

seoane
28-01-2008, 21:17:40
Podrías usar la clase TParser.

Aquí el hilo donde me desasnaron a mi ;) , y me enseñaron la clase TParser

http://www.clubdelphi.com/foros/showthread.php?t=38818

Walterdf
29-01-2008, 00:57:16
Excelente sugerencia, no conocía esa clase!!
Mil gracias!!

Un abrazo.