Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Abrir, leer y escribir un archivo de texto (https://www.clubdelphi.com/foros/showthread.php?t=38060)

zvf 30-11-2006 21:51:45

Abrir, leer y escribir un archivo de texto
 
Hola a todos!!!

Me gustaria saber que funciones utilizar y como declarar la variable para abrir un archivo de texto.

Lo que voy a hacer es abrir ese archivo y buscar dentro de el todas las lineas en donde esta contenida la palabra Email, y copiar desde Email hasta el enter, toda esa linea en otro archivo de texto.

Si tienen alguna sugerencia y me pueden ayudar, muchas gracias!!

Nunca he trabajado con archivos de texto desde delphi, asi que necesito conocer lo basico.

GRACIAS!!!!

Bicho 30-11-2006 22:10:12

Hola, puedes usar varios modos.

Uno puede ser el clásico:
Crear una variable del tipo TextFile
Realizar un Assign para asignar a la variable anterior el fichero de texto
Luego puedes hacer un append del fichero y luego un readln para leer linea a linea del fichero.
Voy a escribirlo de memoria, así que es probable que no compile a la primera
Código Delphi [-]
var f : TextFile;
     lineaactual : string;
begin
  AssignFile('c:\test.txt', f);
  try
    Append(f);
    while not Eof do begin
      Readln(f, lineaactual);  //creo que es así, busca en la ayuda de Delphi para asegurarte
      //aqui haces lo que quieras con lineaactual
    end;
  finally
    Closefile(f);
  end;
end;

Otra manera más como para hacer, puede ser usando un objeto TMemo.
Lo arrastras a tu form y pones lo siguiente:

Código Delphi [-]
Memo1.Lines.LoadFromFile(c:\test.txt);

Ya tienes el fichero cargado en el memo.

Código Delphi [-]
var l : integer;
     linea : string;
begin
  for l := 0 to memo1.lines.count - 1 do begin
    linea := memo1.lines.strings[l];
    if Pos('Email', linea) = 0 then //sino aparece la palabra email en la linea la borramos del memo
       memo1.lines.strings[l] := '';   //debe haber algo mejor que esto,porque te dejará una linea entera en blanco quizá asi: memo1.lines.strings[l] := Trim(memo1.lines.strings[l]); pero no estoy seguro

  end;
  Memo1.Lines.SaveToFile(c:\Final.txt);
end;

Bueno como ves hay un par de alternativas, y seguro que puedes encontrar más.

Saludos

seoane 30-11-2006 22:13:35

:mad: Caramba Bicho, eres un agonioso :D

Código Delphi [-]
var
  i,j: integer;
begin
  with TStringList.Create do
  try
    LoadFromFile('d:\prueba.txt');
    i:= 0;
    while i < Count do
    begin
      j:= Pos('EMAIL',Uppercase(Strings[i]));
      if j > 0  then
      begin
        Strings[i]:= Copy(Strings[i],j,MAXINT);
        inc(i);
      end else
        Delete(i);
    end;
    SaveToFile('d:\resultado.txt');
  finally
    Free;
  end;
end;

zvf 30-11-2006 22:14:55

Muchisimas Gracias!!!

Voy A Probarlo :d

zvf 30-11-2006 22:38:22

Hola!!

Oye, fijate que si funciona, pero quiero hacer un ciclo, hasta que el archivo termine para que me busque todas las lineas con Email, y me las mande al otro archivo, pero lo intento hacer y me marca un error.

Y otra cosa, en el codigo, que es lo que hace Count???

MUCHAS GRACIAS POR SU ATENCION Y AYUDA
DE VERDAD SE LOS AGRADEZCO MUCHISIMO :)

seoane 30-11-2006 22:41:36

¿Que código te marca error el mio o el de Bicho? ¿Y seria también interesante que pusieras cual es el error? ;)

Bicho 01-12-2006 00:11:49

Cita:

Empezado por seoane
Caramba Bicho, eres un agonioso

Hombre, no vas a acaparar aquí todo el código que se escriba en éste foro, no?
Deja que los demás escribamos algo, tambien. :p

Además de que te quejas, ha usado tú código, tú eres el que ha puesto el Count en el ejemplo, no yo. :mad: Aunque el mio compiló a la primera :cool:

Cita:

Empezado por zvf
Oye, fijate que si funciona, pero quiero hacer un ciclo, hasta que el archivo termine para que me busque todas las lineas con Email, y me las mande al otro archivo, pero lo intento hacer y me marca un error.

Y otra cosa, en el codigo, que es lo que hace Count???

MUCHAS GRACIAS POR SU ATENCION Y AYUDA
DE VERDAD SE LOS AGRADEZCO MUCHISIMO

Bueno, te digo lo mismo que seoane, muestranos el mensaje de error que te lanza y el "cacho" de codigo que has escrito para ver donde falla.
Por ciero el count, es una propiedad que tienen los objetos que tienen propiedades te tipo lista, y contiene el numero de elementos que contiene esa lista. En este caso, contiene el numero de elemento que hay en TStringList

Saludos

zvf 01-12-2006 01:08:04

Ahi les va, el codigo de Bicho me manda un error al correrlo, me dice

:confused: :confused: :confused: Project Project1.exe raised exception class EInOutError with message I/O error 6 :confused: :confused: :confused:

Esta excepcion la manda en la linea:
Código Delphi [-]
while not Eof do begin

Ahh, otra cosa la linea:

Código Delphi [-]
AssignFile('c:\test.txt', f);

No compila y la cambie por:

Código Delphi [-]
AssignFile(f,'c:\test.txt');

Y ya esta, solo que manda ese error a la hora de correrlo


Y el de seaone, la primera vez se ejecuto bien, pero despues se cicla.


SABEN PORQUE PUEDA SER??

GRACIAS

seoane 01-12-2006 01:16:43

Cita:

Empezado por zvf
Y el de seaone, la primera vez se ejecuto bien, pero despues se cicla.

:confused: No hay posibilidad de que se "cicle" (me gusta esa palabra, mucho mas adecuada que la que utilizamos por aquí "cuelgue"). Dentro del bucle o se incrementa i o se decrementa Count así que antes o después siempre se sale del bucle. ¿Estas usando el código tal cual o le añades algo mas?

zvf 01-12-2006 01:19:53

Tal cual, mira lo tengo asi, dentro de un boton:

Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var
  i,j: integer;
begin
  with TStringList.Create do
  try
    LoadFromFile('c:\visitasweb.txt');
    i:= 0;
    while i < Count do
    begin
      j:= Pos('EMAIL',Uppercase(Strings[i]));
      if j > 0  then
      begin
        Strings[i]:= Copy(Strings[i],j,MAXINT);
        inc(i);
      end else
        Delete(i);
    end;
    SaveToFile('c:\resultado.txt');
    showMessage ('Listo');
  finally
    Free;
  end;
end;

Y nunca me muestra el mensaje de Listo...

seoane 01-12-2006 01:24:02

:confused: Pues a mi no se me cicla.

seoane 01-12-2006 01:27:26

Lo único que se me ocurre es que el mensaje si se este mostrando y no lo estas viendo, por eso tu aplicación parece colgada. Prueba quitándolo o poniendo un breakpoint en ese punto.

zvf 01-12-2006 01:31:02

Es que sabes que?

Yo tengo un archivo que mide 12.33 megas, pero una vez lo corri y si me dio el resultado bien, las demas veces se esta tardando mucho, y lo interrumpo.

La primer ocurrencia de Email en el archivo esta en la primer linea, y no deberia tardarse puesto que no recorre todo el archivo.

Lo probe con un archivo mas peque;o y si funciono.

O lo tengo que dejar mas tiempo correr?

seoane 01-12-2006 01:34:41

:D Empezáramos por ahí. El algoritmo que te puse es muy bonito pero altamente ineficiente para tratar textos tan grandes. Si lo dejas el tiempo suficiente funcionara, pero hay formas mejores de hacerlo.

zvf 01-12-2006 01:43:53

:) MUCHAS GRACIAS!!

FUNCIONO DE MARAVILLA!!!

Ya obtuve todos los correos que necesitaba.

Pero aun me queda la duda con el algoritmo de bicho, espero que me pueda decir que esta mal en ese codigo

GRACIAS!!!

seoane 01-12-2006 01:53:18

Prueba con algo como esto, debería ser un poco mas rápido:
Código Delphi [-]
var
  i: integer;
  Str: String;
  Source, Dest: TextFile;
begin
  AssignFile(Source,'C:\Origen.txt');
  {$I-}
    Reset(Source);
  {$I+}
  if IOResult = 0 then
  begin
    AssignFile(Dest,'C:\Destino.txt');
    {$I-}
      Rewrite(Dest);
    {$I+}
    if IOResult = 0 then
    begin
      while not Eof(Source) do
      begin
        Readln(Source,Str);
        i:= Pos('EMAIL',Uppercase(Str));
        if i > 0 then
          Writeln(Dest,Copy(Str,i,MAXINT));
      end;
      CloseFile(Dest);
    end;
    CloseFile(Source);
  end;
end;

Bicho 01-12-2006 10:15:59

Ahora el agonioso eres tú!! :D

Que es que no duermes seoane?? Que estás en la misma franja horaria que yo :rolleyes:

Bueno, como ves seoane ya te ha arreglado el código que te puse. :(

Saludos

yusnerqui 01-12-2006 16:16:34

Cita:

Empezado por seaone
{$I-}
Reset(Source);
{$I+}

No se si mi pregunta es demaciado tonta, pero creo que mas tonto seria quedarme con la duda.
Que hace la directiva {$I-}?

Saludos Yusnerqui

Bicho 01-12-2006 16:33:23

Directamente de la ayuda de Delphi
Cita:

Empezado por Esa tecla tan maravillosa llamada F1

Type Switch

Syntax {$I+} or {$I-}
{$IOCHECKS ON} or {$IOCHECKS OFF}

Default {$I+}
{$IOCHECKS ON}

Scope Local


Remarks
The $I switch directive enables or disables the automatic code generation that checks the result of a call to an I/O procedure. I/O procedures are described in the Object Pascal Language Guide. See Standard routines and I/O
!alink(idh_op_standardroutinesandio,1,TopicNotFound,main). If an I/O procedure returns a nonzero I/O result when this switch is on, an EInOutError exception is raised (or the program is terminated if exception handling is not enabled). When this switch is off, you must check for I/O errors by calling IOResult.

Saludos

yusnerqui 03-12-2006 17:04:52

ops, pues muchas gracias, es que tengo un teclado nuevo y no encontraba esa tecla jejeje.

saludos.


La franja horaria es GMT +2. Ahora son las 08:13:10.

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