PDA

Ver la Versión Completa : Problemas con el delimitador de un TStringList


Velia
19-09-2008, 13:52:35
Hola estoy necesitando extraer cadenas de un archivo plano donde el formato es el siguiente

xx|xxxx|xx xxxx xxxxx x|xxx
xx|xxxx|xxxx xxxx xxxx |xxx
xx|xxxx|xxx xxxx xxx |xxx

Y mi código es este



procedure TfrmImportacion.BitBtn1Click(Sender: TObject);
var
i, j : Integer;
cadena : String;
slFile, slLinea : TStringList;
begin
slFile := TStringList.Create;
slLinea := TStringList.Create;
slLinea.Delimiter:= #124; //Defino el delimitador

slFile.LoadFromFile('D:\wpaboent_p14.txt'); //cargo el archivo
for i:=0 to slFile.Count-1 do //Lee por línea
begin
cadena:='';
slLinea.DelimitedText:=slFile[i];
for j:=0 to slLinea.Count-1 do //Lee por delimitador y por espacio en blanco
begin
cadena := cadena+' '+slLinea[j];
showmessage(cadena);
end; // end for j
end;// end for i



El problema es que en vez de leer solamente por delimitador también lee por espacio en blanco, y no sé como hacer para que solo respete el delimitador | = #124

Desde ya agradezco a quien pueda ayudarme
Saludos Velia

seoane
19-09-2008, 13:59:26
Dependiendo de la versión de delphi que tengas puedes usar esto:

slLinea.StrictDelimiter:= TRUE;

coso
19-09-2008, 14:03:01
hola, te dejo este link (http://www.clubdelphi.com/foros/showthread.php?t=58964&highlight=delimitador)que trato algo parecido.

Caro
19-09-2008, 14:08:34
Hola Velia, como te dijeron puedes utilizar STrictDelimiter pero que viene en versiones posteriores a Delphi 7, sino lo tuvieras puedes utilizar la función ExtractString.


slFile.LoadFromFile('D:\wpaboent_p14.txt'); //cargo el archivo
for i:=0 to slFile.Count-1 do //Lee por línea
begin
cadena:='';
ExtractStrings(['|'], [#32], PCHAR(slFile[i]), slLinea);

for j:=0 to slLinea.Count-1 do
begin
cadena := cadena+' '+slLinea[j];
showmessage(cadena);
end; // end for j
end;// end for i


Saluditos

Velia
19-09-2008, 14:48:58
Muchas gracias Caro y Coso acabo de solucionar usando la función
function " StringReplace "

Muy agradecida, les mando saludos
Velia

Velia
22-09-2008, 13:23:00
Chicos abusando de su buena predisposición, acudo para que me den una ultima mano (espero:()

Estoy utilizando la función ExtractStrings de esta forma

ExtractStrings(['|'], [#32], PCHAR(slFile[i]), slLinea);

pero cuando estoy leyendo un archivo plano con este formato x ejemplo

0 1 2 3 4
xxx|xxxx| |xxxx|xxxx
xxx|x xx|xxxx |xxxx|xx
xx|xxxx| |xxxx|


cada vez que quiero leer el contenido de los campos tengo que indicarle la posición y solo cuenta las posiciones que tienen contenido como por ejemplo la primera vez me va a leer la posiciòn 2 = xxxx

Como puedo solucionar esto ya que tengo la versión 7 de delphi y no cuento la función STrictDelimiter ??

Gracias nuevamente

coso
22-09-2008, 18:29:43
Hola velia, yo tiraria por lo directo, aunque seguro que hay maneras mas elegantes:


procedure TForm1.Button1Click(Sender: TObject);
var
sl1, sl2 : TStringList;
i : integer;
begin
sl1 := TStringList.Create;
sl2 := TstringList.Create;
if not Opendialog1.execute then exit;
sl1.LoadFromFile(Opendialog1.Filename);
sl1.text := stringreplace(sl1.text,#32,'-espacio-',[rfIgnorecase,rfReplaceAll]);
sl1.commatext := stringreplace(sl1.text,#124,', ',[rfIgnorecase,rfReplaceAll]);
sl2.commatext := sl1.commatext;
sl2.text := stringreplace(sl1.commatext,'-espacio-',' ',[rfIgnorecase,rfReplaceAll]);
for i := 0 to sl2.count - 1 do showmessage(sl2[i]);
sl1.free;
sl2.free;
end;


lo he hecho a lo rapido, seguro que se puede optimizar. saludos.