Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-11-2006
zvf zvf is offline
Miembro
 
Registrado: abr 2006
Posts: 158
Poder: 19
zvf Va por buen camino
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!!!!
Responder Con Cita
  #2  
Antiguo 30-11-2006
Avatar de Bicho
[Bicho] Bicho is offline
Miembro Premium
 
Registrado: jul 2003
Ubicación: Inca - Mallorca
Posts: 1.776
Poder: 22
Bicho Va por buen camino
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
Responder Con Cita
  #3  
Antiguo 30-11-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Caramba Bicho, eres un agonioso

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;
Responder Con Cita
  #4  
Antiguo 30-11-2006
zvf zvf is offline
Miembro
 
Registrado: abr 2006
Posts: 158
Poder: 19
zvf Va por buen camino
Muchisimas Gracias!!!

Voy A Probarlo :d
Responder Con Cita
  #5  
Antiguo 30-11-2006
zvf zvf is offline
Miembro
 
Registrado: abr 2006
Posts: 158
Poder: 19
zvf Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 30-11-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
¿Que código te marca error el mio o el de Bicho? ¿Y seria también interesante que pusieras cual es el error?
Responder Con Cita
  #7  
Antiguo 01-12-2006
Avatar de Bicho
[Bicho] Bicho is offline
Miembro Premium
 
Registrado: jul 2003
Ubicación: Inca - Mallorca
Posts: 1.776
Poder: 22
Bicho Va por buen camino
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.

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

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
Responder Con Cita
  #8  
Antiguo 01-12-2006
zvf zvf is offline
Miembro
 
Registrado: abr 2006
Posts: 158
Poder: 19
zvf Va por buen camino
Ahi les va, el codigo de Bicho me manda un error al correrlo, me dice

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

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

Última edición por zvf fecha: 01-12-2006 a las 01:23:52.
Responder Con Cita
  #9  
Antiguo 01-12-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por zvf
Y el de seaone, la primera vez se ejecuto bien, pero despues se cicla.
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?
Responder Con Cita
  #10  
Antiguo 01-12-2006
zvf zvf is offline
Miembro
 
Registrado: abr 2006
Posts: 158
Poder: 19
zvf Va por buen camino
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...
Responder Con Cita
  #11  
Antiguo 01-12-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Pues a mi no se me cicla.
Responder Con Cita
  #12  
Antiguo 01-12-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
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.
Responder Con Cita
  #13  
Antiguo 01-12-2006
zvf zvf is offline
Miembro
 
Registrado: abr 2006
Posts: 158
Poder: 19
zvf Va por buen camino
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?
Responder Con Cita
  #14  
Antiguo 01-12-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
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.
Responder Con Cita
  #15  
Antiguo 01-12-2006
zvf zvf is offline
Miembro
 
Registrado: abr 2006
Posts: 158
Poder: 19
zvf Va por buen camino
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!!!
Responder Con Cita
  #16  
Antiguo 01-12-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
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;
Responder Con Cita
  #17  
Antiguo 01-12-2006
Avatar de Bicho
[Bicho] Bicho is offline
Miembro Premium
 
Registrado: jul 2003
Ubicación: Inca - Mallorca
Posts: 1.776
Poder: 22
Bicho Va por buen camino
Ahora el agonioso eres tú!!

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

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

Saludos
Responder Con Cita
  #18  
Antiguo 01-12-2006
Avatar de yusnerqui
yusnerqui yusnerqui is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuba
Posts: 679
Poder: 21
yusnerqui Va por buen camino
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
__________________
Lo importante no es llegar primero, sino saber llegar.

Para que puedas llegar mejor lee la Guia de Estilo

Responder Con Cita
  #19  
Antiguo 01-12-2006
Avatar de Bicho
[Bicho] Bicho is offline
Miembro Premium
 
Registrado: jul 2003
Ubicación: Inca - Mallorca
Posts: 1.776
Poder: 22
Bicho Va por buen camino
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
Responder Con Cita
  #20  
Antiguo 03-12-2006
Avatar de yusnerqui
yusnerqui yusnerqui is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuba
Posts: 679
Poder: 21
yusnerqui Va por buen camino
ops, pues muchas gracias, es que tengo un teclado nuevo y no encontraba esa tecla jejeje.

saludos.
__________________
Lo importante no es llegar primero, sino saber llegar.

Para que puedas llegar mejor lee la Guia de Estilo

Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Sobre Escribir un archivo de texto mangel Varios 7 04-06-2012 22:29:04
Sin saber leer ni escribir D-MO Humor 3 13-09-2006 08:47:43
Como leer un archivo de texto por codigo Shidalis Varios 2 03-09-2005 05:54:34
leer y escribir en BD SqlServer con ADOStoredProc marctonyus Gráficos 1 17-07-2005 22:13:12
Leer un TQuery y armar un archivo de texto Oscar25 Conexión con bases de datos 1 01-09-2004 16:21:51


La franja horaria es GMT +2. Ahora son las 17:37:07.


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
Copyright 1996-2007 Club Delphi