PDA

Ver la Versión Completa : Dudas usando la clase TStringList


blamsa
26-05-2005, 09:45:29
Hola amigos, necesito ayuda en el uso de la clase TStringList. Estoy intentando leer un fichero de texto .rtf usando esta clase. Al abrirlo con List.Loadfromfile me gustaria poner algun mensaje de error si el archivo no está en la ruta indicada...pero esta instruccion no retorna nada, verdad? Como podria hacerlo? Luego, una vez lo tengo abierto, lo voy recorriendo por lineas List[i] pero necesito en cada linea eliminar una cabecera que siempre es la misma en todas las lineas. Como puedo modificar el contenido de una linea? Como hago para recorrerla hasta encontrar la frase en cuestión que quiero eliminar? Y para extraer una palabra concreta de una linea como lo hago?
Gracias!!!

S.M.S.
26-05-2005, 10:47:59
Para tratar el mensaje de error, antes de cargar el archivo en en el StringList, utiliza la función FileExists() que devuelve false si el archivo no existe. Luego, dentro del recorrido que haces por las lineas, para averiguar la posición de la cabecera a eliminar utiliza la función pos() y para extraer la frase sin cabecera tienes la función copy().

Espero que con esto puedas montar el código según tus necesidades concretas.

Saludos

dec
26-05-2005, 19:42:48
Hola,

Para el caso de la primera cuestión que planteas, con el permiso de S.O.S. otra opción puede ser algo así:


procedure TForm1.Button1Click(Sender: TObject);
var
t: TStrings;
begin
t := TStringList.Create;
try
try
t.LoadFromFile('C:\archivo.txt');
// (más instrucciones...)
except
on E: EFOpenError do ShowMessage(E.Message);
on E: Exception do ShowMessage(E.Message);
end;
finally
t.Free;
end;
end;

roman
26-05-2005, 20:33:41
Para debate:

Ya alguna vez se debatió acerca de esto y reafirmo mi opinión:

Las excepciones deben usarse para controlar errores que no podemos detectar a tiempo, no para cualquier cosa que un simple condicional previo nos evitaría.

Incluso la misma ayuda de Delphi dice:


Conditional statements are often the best way to test for errors. For example, suppose you want to make sure that a file exists before trying to open it. You could do it this way:



try
AssignFile(F, FileName);
Reset(F); // raises an EInOutError exception if file is not found
except
on Exception do ...
end;


But you could also avoid the overhead of exception handling by using



if FileExists(FileName) then // returns False if file is not found; raises no exception
begin
AssignFile(F, FileName);
Reset(F);
end;



// Saludos

dec
26-05-2005, 21:16:45
Hola,

roman, estoy de acuerdo contigo, y, en este caso concreto más todavía si cabe: la ayuda de Delphi me reafirma en lo dicho, pues sus razones tendrá para decir lo que dices que dice (¿tal vez sea más eficiente utilizar la instrucción condicional que no tratar de capturar las posibles excepciones?).

Quizás mi intención al plantear aquí el uso de excepciones partía de lo que se decía más arriba:


Al abrirlo con List.Loadfromfile me gustaria poner algun mensaje de error si el archivo no está en la ruta indicada...pero esta instruccion no retorna nada, verdad?

Quería indicar que, efectivamente, podría hacerse algo para comprobar si las instrucciones referidas se llevaban a cabo o no lo hacían y porqué.

En cualquier caso, como digo, estoy de acuerdo contigo: lo leí en cierto libro sobre Delphi de cuyo nombre no consigo acordarme, o tal vez era algún tutorial o artículo o algo así: no se debe abusar del uso de las excepciones y ante la duda es mejor no utilizarlas, venía a decir el texto a que me refiero.

Estoy leyendo ahora La cara oculta de Delphi 4 (http://www.marteens.com/CaraOculta.htm) del amigo Ian Marteens (http://www.marteens.com/) (que es un cachondo mental, que me place leer) y aún no llegué al capítulo en que se trata sobre las excepciones. Probablemente no pueda sino reafirmarme en lo dicho, esto es, darte la razón roman, pero, no como a loco, entiéndase bien.

blamsa
27-05-2005, 13:55:30
Muchas gracias por vuestras respuestas...me han sido de mucha utilidad. Necesito alguna ayudita mas. En el archivo que leo tengo lineas de esta guisa, entre otras:

palabra ruta\ruta\ruta\ruta\asd@asd.com

No todas las lineas empiezan por "palabra"...como hago para saber si una linea empieza por "palabra"? Una vez se que la linea empieza por "palabra", necesito extraer el "asd@asd.com" del final de todo y que en cada linea será diferente. Como lo hago?
Gracias de nuevo!!

jachguate
27-05-2005, 16:50:48
Podes valerte de las funciones pos y copy para conseguirlo.


if pos('palabra', línea) = 1 Then
Begin
//la línea comienza con "palabra"
HacerElResto;
end;


Hasta luego.

;)