Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Leer lineas de un txt sin utilizar ningún componente (https://www.clubdelphi.com/foros/showthread.php?t=83655)

force1758 11-07-2013 06:26:39

Leer lineas de un txt sin utilizar ningún componente
 
Hola amigo de esta hermosa comunidad vuelvo a caer de nuevo en una duda ya que necesito un poco de su ayuda respecto a mi proyecto el cual se trata de cargar de aun archivo de texto(txt), linea por linea claro que no sea utilizando un tmemo o un edit nada de eso solo lo carga y separando cada linea colocare un valor que contenga esa linea;.. espero que me puedan entender lo que quiero hacer

Aqui dejo un trozo de el codigo que quiero hacer solo lee la primera linea del txt a cual yo le doy un valor ya que cambio de string integer

Código Delphi [-]
var
MiFichero : TextFile;
valor :dword;
valor1 :dword;
valorsting : String;
begin
try

AssignFile (MiFichero,(C:\nombre.txt'));
Reset (MiFichero);
Read(MiFichero,valorsting);
valor:= StrToInt (valorsting);

Hasta alli todo perfecto Pero me gustaría colocar mas valores, pero solo consigo leer la primera linea , que si hubiera otra forma de agregar mas valores pero de las siguientes lineas ,.se los agradeceria por su ayuda .

Saludos Gracias

newtron 11-07-2013 09:50:47

Hola.

Para lo que quieres solo necesitas una pequeña modificación a tu código:

Código Delphi [-]
AssignFile (MiFichero,(C:\nombre.txt'));
Reset (MiFichero);
While not Eof(MiFichero) do begin
  ReadLn(MiFichero,valorsting);
  ShowMessage(valorsting);
end;

Esto va leyendo el fichero linea a linea hasta el final, ya puedes adaptarlo a tus necesidades.

Saludos

force1758 11-07-2013 15:18:12

Cita:

Empezado por newtron (Mensaje 463663)
Hola.

Para lo que quieres solo necesitas una pequeña modificación a tu código:

Código Delphi [-]
AssignFile (MiFichero,(C:\nombre.txt'));
Reset (MiFichero);
While not Eof(MiFichero) do begin
  ReadLn(MiFichero,valorsting);
  ShowMessage(valorsting);
end;

Esto va leyendo el fichero linea a linea hasta el final, ya puedes adaptarlo a tus necesidades.

Saludos

Si lo se pero no me sirve por que yo necesito es cojer la información de cada linea y colocarle una variable ya que cada linea se convertira en un valor espero haberme explicado .

Casimiro Noteví 11-07-2013 16:21:41

Cita:

Empezado por force1758 (Mensaje 463677)
Si lo se pero no me sirve por que yo necesito es cojer la información de cada linea y colocarle una variable ya que cada linea se convertira en un valor espero haberme explicado .

Pues eso es exactamente lo que te han explicado en ese código.

Neftali [Germán.Estévez] 11-07-2013 16:59:39

La otra opción es utilizar TStrings, pero no me queda claro porqué no te sirve lo que te han comentado.
¿Puedes explicarte mejor?

newtron 11-07-2013 18:19:45

Bueeeeeeeeeeeeeeeeeeeeeno.... a ver si esto es lo que quieeeeeeeeeeres....

Código Delphi [-]
var
MiFichero : TextFile;
valor :dword;
valor1 :dword;
valorsting : TStringList;
sAux: String;
begin
  valorsting: TStringList.Create;
  AssignFile (MiFichero,(C:\nombre.txt'));
  Reset (MiFichero);
  While not MiFichero.eof do begin
    Readln(MiFichero,sAux);
    valorsting.add(sAux);
  end;
  .....

end;

de esta manera te encontrarás en la variable valorsting[N] los valores de cada una de las lineas del fichero de texto, recuerda hacer un "free" a la variable valorsting cuando ya no la necesites para liberarla de la memoria.

(seguro que alguno de estos "listillos" tiene una forma más simple, efectiva o que use menos recursos para hacer esto, lo estoy viendo...) :D

ecfisa 11-07-2013 19:25:48

Hola force1758.

Estos son algunas de las formas que podes leer un archivo de texto por líneas (newtron y Neftali ya te mencionaron y ejemplificaron las dos mas ortodóxas)

Con Readln
Código Delphi [-]
var
  txt : TextFile;
  line: string;
begin
  AssignFile(txt, 'C:\nombre.txt');
  Reset(txt);
  while not eof(txt) do
  begin
    Readln(txt,line);
    Memo1.Lines.Add(line); // hacer algo con las lineas
  end;
  CloseFile(txt);
end;

Con TStrings:
Código Delphi [-]
begin
  with TStringList.Create do
  try
    LoadFromFile('C:\nombre.txt');
  finally
    Memo1.Text := Text; // hacer algo con las lineas
    Free;
  end;
end;

Con FileStream:
Código Delphi [-]
var
 s  : string;
begin
  with TFileStream.Create('C:\nombre.txt',fmOpenRead) do
  try
    Seek(0,soFromBeginning);
    SetLength(s, Size);
    Read(Pointer(s)^, Size);
  finally
    Free;
    Memo1.Text := s; // hacer algo con las lineas
  end;
end;

Con MemoryStream
Código Delphi [-]
var
  s : string;
begin
  with TMemoryStream.Create do
  try
    LoadFromFile('C:\nombre.txt');
    Seek(0, soFrombeginning);
    SetLength(s,Size);
    Read(Pointer(s)^, Size);
  finally
    Free;
    Memo1.Text := s;
  end;
end;
Y las combinaciones que con ellas se te ocurran y sea posible implementar.

Saludos. :)

Edito: Si comparas tu primer código con el de newtron, verás que ademas de no usar un ciclo para la lectura, estás usando Read y no Readln.

Casimiro Noteví 11-07-2013 19:55:32

Esto es un curso completo de lectura de ficheros de texto ^\||/

force1758 11-07-2013 20:12:42

Hola bueno voy haber si me explico mejor así con el codigo lo que quiero en si es crear una función que lea cada linea del archivo luego separar esas lineas en valores sin utilizar tmemo, ni form , ni edit ya que esta es una dll la cual yo utilizarlo en ejecución de mi aplicación



Código Delphi [-]
Function leerText (Const valor: Array [1..5] of String):string;
var
MiFichero : TextFile;
valorsting : String;

begin
AssignFile (MiFichero,(C:\nombre.txt'));
Reset (MiFichero);
Read(MiFichero,valorsting);// aqui leo es siempre la primera linea 
valor[1]:= StrToInt (valorsting); // quiero obtener el valor de la primera linea
valor[2]:= StrToInt (valorsting); // quiero obtener el valor de la segunda linea
valor[3]:= StrToInt (valorsting); // quiero obtener el valor de la trecera linea
valor[4]:= StrToInt (valorsting); // quiero obtener el valor de la cuarta  linea
valor[5]:= StrToInt (valorsting); // quiero obtener el valor de la quinta linea

y utilizar esos valores obtenido en otro procedimientos por eso necesito ver como lo hago para emplearlo en mi code (sin utilizar nada de tmemo,memo1,edit puro código ) y gracias por estar tan atentos por que todos estos ejemplo me sirve para tener mas experiencia

Saludos

Casimiro Noteví 11-07-2013 20:18:40

En fin, creo que te has saltado alguna respuesta, mira el hilo desde el principio ;)

egostar 11-07-2013 20:20:49

Cita:

Empezado por force1758 (Mensaje 463706)
Hola bueno voy haber si me explico mejor así con el codigo lo que quiero en si es crear una función que lea cada linea del archivo luego separar esas lineas en valores sin utilizar tmemo, ni form , ni edit ya que esta es una dll la cual yo utilizarlo en ejecución de mi aplicación

y utilizar esos valores obtenido en otro procedimientos por eso necesito ver como lo hago para emplearlo en mi code (sin utilizar nada de tmemo,memo1,edit puro código ) y gracias por estar tan atentos por que todos estos ejemplo me sirve para tener mas experiencia

Hombre, ecfisa te ha propuesto dos opciones, Neftali una y newtron otra, cual es la objeción que le pones a esos objetos, eso que te proponen pues es puro código.....:rolleyes:

TFileStream, TMemoryStream, TStrings, TStringList

Si no es eso, no se que es lo que necesitas.

Saludos

newtron 11-07-2013 20:25:31

Cita:

Empezado por Casimiro Notevi (Mensaje 463705)
Esto es un curso completo de lectura de ficheros de texto ^\||/

....este ecfisa.... siempre igual...... :p

newtron 11-07-2013 20:26:52

Cita:

Empezado por force1758 (Mensaje 463706)
Hola bueno voy haber si me explico mejor así con el codigo lo que quiero en si es crear una función que lea cada linea del archivo luego separar esas lineas en valores sin utilizar tmemo, ni form , ni edit ya que esta es una dll la cual yo utilizarlo en ejecución de mi aplicación



Código Delphi [-]Function leerText (Const valor: Array [1..5] of String):string; var MiFichero : TextFile; valorsting : String; begin AssignFile (MiFichero,(C:\nombre.txt')); Reset (MiFichero); Read(MiFichero,valorsting);// aqui leo es siempre la primera linea valor[1]:= StrToInt (valorsting); // quiero obtener el valor de la primera linea valor[2]:= StrToInt (valorsting); // quiero obtener el valor de la segunda linea valor[3]:= StrToInt (valorsting); // quiero obtener el valor de la trecera linea valor[4]:= StrToInt (valorsting); // quiero obtener el valor de la cuarta linea valor[5]:= StrToInt (valorsting); // quiero obtener el valor de la quinta linea


y utilizar esos valores obtenido en otro procedimientos por eso necesito ver como lo hago para emplearlo en mi code (sin utilizar nada de tmemo,memo1,edit puro código ) y gracias por estar tan atentos por que todos estos ejemplo me sirve para tener mas experiencia

Saludos

mmmmmmmmmmmmm.... ahora si que me estoy perdiendo..... :confused:

ecfisa 11-07-2013 20:43:28

Cita:

Empezado por force1758 (Mensaje 463706)
Hola bueno voy haber si me explico mejor así con el codigo lo que quiero en si es crear una función que lea cada linea del archivo luego separar esas lineas en valores sin utilizar tmemo, ni form , ni edit ya que esta es una dll la cual yo utilizarlo en ejecución de mi aplicación
y utilizar esos valores obtenido en otro procedimientos por eso necesito ver como lo hago para emplearlo en mi code (sin utilizar nada de tmemo,memo1,edit puro código )

Hola.

Cualquiera de los modos que te han sugerido hace lo que deseas: Lee un archivo de texto por líneas.

Lo que hagas luego con las líneas leídas ya sea que las guardes en un arreglo, las asignes a un ListBox, las imprimas, etc. es otro tema.

En ninguna de las propuestas anteriores se utiliza componentes para la lectura, sólo a modo de ejemplo se muestran en un memo (que es la única referencia a uno).

Pero como te comente en mi mensaje anterior si optas por leerlo línea a línea no utilices el procedimiento Read usá Readln.
Y usando Readln tenes que recorrer el archivo desde el inicio hasta el final con un ciclo (preferentemente while).

Otro detalle sobre tu último código, valorsting es de tipo string y cuando haces referencia a valorstring[n] no te estás refiriendo a un valor de tipo string sino de tipo Char.

Resumiendo: No podes almacenar las líneas leídas en un string (la nueva sobreescribiría a la anterior) y usando Readln tenes que leer desde la primer línea a la última del archivo.

Saludos. :)

force1758 11-07-2013 21:49:22

Ok pero como podría hacer para escojer en el ciclo las lineas una por una o si tienes algun ejemplo que pueda probar

Saludos

Casimiro Noteví 11-07-2013 22:46:56

Cita:

Empezado por force1758 (Mensaje 463717)
si tienes algun ejemplo que pueda probar

Ya te han puesto varios ejemplos, ¿no te sirve ninguno?

ecfisa 11-07-2013 23:37:07

Cita:

Empezado por force1758 (Mensaje 463717)
Ok pero como podría hacer para escojer en el ciclo las lineas una por una o si tienes algun ejemplo que pueda probar

Hola.

Como te mencionó Casimiro con cualquiera de los modos que te han sugerido antes. Ahora, si lo que sucede es que no deseas almacenar las líneas en TStrings, podrías usar un arreglo dinámico.

Ejemplo:
Código Delphi [-]
var
  f: TextFile;
  lineas: array of string;
begin
  AssignFile(f, 'C:\nombre.txt');
  Reset(f);
  while not eof(f) do
  begin
    SetLength(lineas, Length(lineas)+1);
    Readln(f, lineas[High(lineas)]);
  end;
  CloseFile(f);
end;

Saludos :)

nlsgarcia 12-07-2013 01:58:51

force1758,

Cita:

Empezado por force1758

...cargar de aun archivo de texto(txt), linea por linea...separando cada linea colocare un valor que contenga esa linea..

...necesito es cojer la información de cada linea y colocarle una variable...

...lo que quiero en si es crear una función que lea cada linea del archivo luego separar esas lineas en valores sin utilizar tmemo, ni form , ni edit ya que esta es una DLL la cual yo utilizarlo...

...y utilizar esos valores obtenido en otro procedimientos...

...pero como podría hacer para escojer en el ciclo las lineas una por una...

Te comento:

1- Cualquiera de las opciones sugeridas anteriormente funciona en un DLL.

2- En un DLL se pueden incluir componentes visuales.

Revisa este código:
Código Delphi [-]
library DLLFileProcess;

uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;

var
   FileVector : Array of String;
   FileInput : String;

{$R *.res}

// Carga un Archivo Línea a Línea en el Arreglo FileVector
function ReadTextFile(FileName : PChar) : Boolean; Stdcall;
var
   F : TextFile;
   i : Integer;
   Buffer : String;

begin

   if FileName = EmptyStr then
   begin
      MessageDlg('El Nombre del Archivo No Puede Estar en Blanco', mtInformation, [mbOK], 0);
      Result := False;
      Exit;
   end;

   if not FileExists(FileName) then
   begin
      MessageDlg('El Archivo no Existe en el Path Indicado', mtInformation, [mbOK], 0);
      Result := False;
      Exit;
   end;

   FileInput := FileName;

   try
      FileMode := fmOpenRead;
      AssignFile(F, FileName);
      Reset(F);
      i := 1;
      while not Eof(F) do
      begin
         Readln(F, Buffer);
         SetLength(FileVector,i);
         FileVector[i-1] := Buffer;
         Inc(i);
      end;
      CloseFile(F);
      Result := True;
   except
      MessageDlg('Error de I/O', mtInformation, [mbOK], 0);
      Result := False;
   end;

end;

// Genera un Archivo de Salida con la Información del Arreglo FileVector
function WriteTextFile() : Boolean; Stdcall;
var
   FileOutput : String;
   F : TextFile;
   i : Integer;
   Buffer : String;

begin

   FileOutput := ExtractFilePath(FileInput) + 'FileOutPut.txt';

   if Length(FileVector) = 0 then
   begin
      MessageDlg('El Arreglo No Contiene Información', mtInformation, [mbOK], 0);
      Result := False;
      Exit;
   end;   

   try
      FileMode := fmOpenWrite;
      AssignFile(F, FileOutput);
      Rewrite(F);
      for i:= low(FileVector) to High(FileVector)  do
      begin
         Buffer := 'LN-' + IntToStr(i+1) + ' ' + FileVector[i];
         Writeln(F, Buffer);
      end;
      CloseFile(F);
      Result := True;
   except
      MessageDlg('Error de I/O', mtInformation, [mbOK], 0);
      Result := False;
   end;

end;

Exports
   ReadTextFile,
   WriteTextFile;
   
begin
end.
El código anterior lee un archivo de texto línea x línea en un DLL, almacena su contenido en un arreglo y genera un nuevo archivo con el arreglo como ejemplo de procesamiento del mismo.

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  function ReadTextFile(FileName : PChar) : Boolean; Stdcall; External 'DLLFileProcess.dll';
  function WriteTextFile() : Boolean; Stdcall; External 'DLLFileProcess.dll';
  
var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
   OpenDialog : TOpenDialog;

begin
   OpenDialog := TOpenDialog.Create(self);
   OpenDialog.InitialDir := 'C:\';
   OpenDialog.Options := [ofFileMustExist];
   OpenDialog.Filter := '*.txt';

   if OpenDialog.Execute then
   begin

      if ReadTextFile(PChar(OpenDialog.FileName)) then
         MessageDlg('Archivo Procesado Exitosamente', mtInformation, [mbOK], 0)
      else
         MessageDlg('Error en Procesamiento de Archivo', mtInformation, [mbOK], 0)

   end
   else
      MessageDlg('No Se Selecciono Ningún Archivo', mtInformation, [mbOK], 0);

   OpenDialog.Free;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin

   if WriteTextFile() then
      MessageDlg('Archivo Generado Exitosamente', mtInformation, [mbOK], 0)
   else
      MessageDlg('Error en Generación de Archivo', mtInformation, [mbOK], 0)

end;

end.
El código anterior permite llamar a las funciones del DLL del ejemplo precedente para el procesamiento de un archivo de texto.

Todo el código comentado esta disponible en el link: http://terawiki.clubdelphi.com/Delph...ileProcess.rar

Te sugiero revisar el ejemplo del link como todos los ejemplos sugeridos anteriormente, de seguro te serán de utilidad en tu proyecto.

Espero sea útil :)

Nelson.

force1758 12-07-2013 19:36:08

Gracias a todos por ayudarme en especial nlsgarcia por su src que me sirvió mucho de ejemplo pero mi ignorancias es indescriptible pero haber si me ayudan a pasarla a funcion se lo agradecería muchísimo aquí esta el codigo que trabaja perfecto a lo que buscaba solo que lo quiero en funtion



Código Delphi [-]
var
FileVector :  Array [0..6] of String;

procedure TForm1.Button1Click(Sender: TObject);
var
   F : TextFile;
   i : Integer;
   Buffer : String;
begin
try
AssignFile(F,'C:\nombre.txt');
Reset(F);
      i := 0;
      while not Eof(F) do
      begin
         Readln(F, Buffer);
         SetLength(FileVector[6],i);
         FileVector[i+1] := Buffer;
         Inc(i);
      end;
      except
end;
 label1.Caption := (FileVector[1]);
 label2.Caption := (FileVector[2]);
 label3.Caption := (FileVector[3]);
 label4.Caption := (FileVector[4]);
      end;

trabaja como quiero solo aunque ahora lo quiero es hacerlo en una funtion no con evento onclick espero que tambien le sirva a alguien para lo que quiera y si tienen otra idea a demas de esta pueden colocarla

Saludos y Gracias

nlsgarcia 12-07-2013 22:41:30

force1758,

Cita:

Empezado por force1758
...me ayudan a pasarla a función...

Revisa esta código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TArrayStr = Array of String;

var
  Form1: TForm1;
  FileVector : TArrayStr;

implementation

{$R *.dfm}

// Lee un archivo de texto y lo devuelve como un arreglo.
function ReadTextFile(FileName : String) : TArrayStr;
var
   F : TextFile;
   i : Integer;
   Buffer : String;

begin

   try

      FileMode := fmOpenRead;
      AssignFile(F, FileName);
      Reset(F);

      i := 1;
      while not Eof(F) do
      begin
         Readln(F, Buffer);
         SetLength(Result,i);
         Result[i-1] := Buffer;
         Inc(i);
      end;

      CloseFile(F);

   except

      MessageDlg('Error de I/O', mtInformation, [mbOK], 0);

   end;

end;

// Modifica el caption de los TLabel en función de las entradas de un archivo de texto.
procedure TForm1.Button1Click(Sender: TObject);
var
   i : Integer;

begin

   FileVector := ReadTextFile('C:\TestFile.txt');
   for i := Low(FileVector) to High(FileVector) do
   begin
      // Solo se modifican los Caption de los Tlabel que esten definidos en el Form independientemente
      // de la cantidad de elementos de FileVector (Registros del Archivo de Texto)
      TLabel(FindComponent(Format('Label%d',[i+1]))).Caption := FileVector[i];
   end;

end;

end.
El código anterior lee por medio de una función un archivo de texto línea x línea y carga su contenido en un arreglo el cual es retornado como resultado de la función y utilizado posteriormente para modificar la propiedad Caption de los Componentes TLabel de un Form.

Te sugiero consultar este link, te sera útil como información general de Delphi:
Cita:

Delphi Basics : http://www.delphibasics.co.uk/
Espero sea útil :)

Nelson.

cloayza 13-07-2013 03:51:42

Ponga algo de esfuerzo amigazo...Así nunca saldra de la ignorancia...

"...aquí esta el codigo que trabaja perfecto a lo que buscaba solo que lo quiero en funtion "...v\||/

Alguna otra casita...:D

force1758 13-07-2013 05:57:55

Gracias a todo por estos ejemplo me quedare con el que puse de ultimo, me sirve para lo que necesito hacer Gracias y hasta la próxima amigos:....


La franja horaria es GMT +2. Ahora son las 06:37:36.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi