Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   problemas con archivos de texto (https://www.clubdelphi.com/foros/showthread.php?t=94014)

oscarac 19-06-2019 19:46:49

problemas con archivos de texto
 
buenos dias
estoy haciendo un proceso de actualizacion con data bajada de una web
el archivo es este
http://www.sunat.gob.pe/descarga/Bue...ueCont_TXT.zip

dentro hay un archivo txt
cuando lo descargo, no se aprecian los saltos de linea las linea

f1 : TextFile;


Código Delphi [-]
AssignFile(f1, 'BueCont_TXT.txt');
  Reset(f1);
  while not Eof(f1) do
  begin
    _ruc := '';
    _RazonSocial := '';
    _desde := '';
    _Resol := '';
    Readln(f1, slinea);
    for i:= 1 to Length(sLinea) do
    begin

pero en sLinea me jala todo el archivo..... y no las lineas 1 x 1


cuando abroi el archivo en cuestion con le block de notas, sale todo mezclado, pero cuando uso otro editor llamese Sublime o notepad++ sale ordenado

alguien sabe como se puede abrir de esa forma en delphi?
o quiza estoy abriendo mal el archivo?

cloayza 19-06-2019 21:55:23

A si puedo darte una mano.

Me imagino que el archivo que estas intentando leer viene de algún Unix* o Linux.

Debido a eso el final de linea no es el mismo que los archivos de texto de windows.

Unix*linux: Marcador fin de linea es #13
linea-> aaaa#13

Windows: Marcador fin de linea es #13+#10
linea-> aaaa#13#10

Es por este motivo que al leerlo asume que es una GRAN LINEA.

Solución hay varias en la web te adjunto un ejemplo de lectura no es lo mejor es solo con fines didacticos.

Código Delphi [-]
procedure TForm4.Button1Click(Sender: TObject);
var
   f1 : TextFile;
   line:string;
   s:char;
begin
     AssignFile(f1, edtFile.Text);
     Reset(f1);

     memo1.lines.clear;

     while not Eof(f1) do
     begin
          Read(f1, s);
          {Evalua si S= (#13 = #$D)}
          if (s=#$D) then
          begin
              memo1.lines.Add(line);
              line:='';
          end
          else
          begin
              line:=line+s;
          end;
     end;
     closefile(f1);
end;

Recuerda esta codigo es muyyyyy lento ya que lee un caracter a vez...

Acá Converting from Windows ASCII to UNIX ASCII Text Files enlace donde proponen dos rutinas para convertir...

Saludos cordiales

oscarac 19-06-2019 23:49:36

Cita:

Empezado por cloayza (Mensaje 532466)
A si puedo darte una mano.

Me imagino que el archivo que estas intentando leer viene de algún Unix* o Linux.

Debido a eso el final de linea no es el mismo que los archivos de texto de windows.

Unix*linux: Marcador fin de linea es #13
linea-> aaaa#13

Windows: Marcador fin de linea es #13+#10
linea-> aaaa#13#10

Es por este motivo que al leerlo asume que es una GRAN LINEA.

Solución hay varias en la web te adjunto un ejemplo de lectura no es lo mejor es solo con fines didacticos.

Código Delphi [-]
procedure TForm4.Button1Click(Sender: TObject);
var
   f1 : TextFile;
   line:string;
   s:char;
begin
     AssignFile(f1, edtFile.Text);
     Reset(f1);

     memo1.lines.clear;

     while not Eof(f1) do
     begin
          Read(f1, s);
          {Evalua si S= (#13 = #$D)}
          if (s=#$D) then
          begin
              memo1.lines.Add(line);
              line:='';
          end
          else
          begin
              line:=line+s;
          end;
     end;
     closefile(f1);
end;

Recuerda esta codigo es muyyyyy lento ya que lee un caracter a vez...

Acá Converting from Windows ASCII to UNIX ASCII Text Files enlace donde proponen dos rutinas para convertir...

Saludos cordiales



y con funcionan?
tienes un ejemplo?

cloayza 19-06-2019 23:59:37

:confused:

Y el código que puse?

Necesitas un Tform + tmemo + button...

Este código llenara el memo con las líneas del archivo de texto BueCont_TXT.txt
Código Delphi [-]
procedure TForm4.Button1Click(Sender: TObject);
var
   f1 : TextFile;
   line:string;
   s:char;
begin
     AssignFile(f1, 'BueCont_TXT.txt'); //edtFile.Text);
     Reset(f1);

     memo1.lines.clear;

     while not Eof(f1) do
     begin
          Read(f1, s);
          {Evalua si S= (#13 = #$D)}
          if (s=#$D) then
          begin
              memo1.lines.Add(line);
              line:='';
          end
          else
          begin
              line:=line+s;
          end;
     end;
     closefile(f1);
end;
Que mas!!!
:D

ElKurgan 20-06-2019 07:23:01

Haya otra posibilidad, y es cargar el archivo en un TStringList. Cuando haces un LoadFromFile interpreta cada retorno de carro como un cambio de elemento, y luego puedes recorrerlo de esta forma:

Código Delphi [-]
MiStringList.LoadFromFile('BueCont_TXT.txt');
for i := o to MiStringList.Count - 1 do
begin
  slínea := MiStringList[i];
  for i:= 1 to Length(sLinea) do
  begin
  ....
end;

Un saludo

bucanero 20-06-2019 10:35:44

hola

aquí te dejo otra solución que te puede funcionar

Código Delphi [-]
  
  procedure loadFileContent(const AFileName:String);
  var
    text: TStreamReader;
    slinea: string;
  begin
    try
      text := TStreamReader.Create(AFileName, TEncoding.Default, true);
      while not text.EndOfStream do begin
        slinea := text.ReadLine;
        ProcesarLinea(slinea);
      end;
    finally
      text.Free;
    end;
  end;

var
  FileName: string;
begin
    FileName := 'c:\tmp\BueCont_TXT.txt';
    loadFileContent(FileName);
end;

y si lo que quieres es separar los campos incluidos dentro del propio fichero puedes hacerlo de una forma relativamente fácil de esta manera:
Código Delphi [-]

var
  parser: TStringList;

  procedure ProcesarLinea(const ALinea: string);
  var
    Ruc, nombre, razon, fecha, resolucion: string;
  begin
    parser.DelimitedText := '"' + ALinea.Replace('"', '""').Replace('|', '"|"') + '"';

    if parser.Count >= 5 then begin
      Ruc := parser.Strings[0];
      nombre := parser.Strings[1];
      razon := parser.Strings[2];
      fecha := parser.Strings[3];
      resolucion := parser.Strings[4];
    end;

    Memo1.Lines.Add(Ruc + #9 + nombre + #9 + razon + #9 + fecha + #9 + resolucion);
  end;

var
  FileName: string;
begin
  try
    parser := TStringList.Create;
    parser.StrictDelimiter := True;
    parser.Delimiter := '|';

    FileName := 'c:\tmp\BueCont_TXT.txt';
    loadFileContent(FileName);
  finally
    parser.Free;
  end;
end;

saludos


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

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