PDA

Ver la Versión Completa : problemas con archivos de texto


oscarac
19-06-2019, 19:46:49
buenos dias
estoy haciendo un proceso de actualizacion con data bajada de una web
el archivo es este
http://www.sunat.gob.pe/descarga/BueCont/BueCont_TXT.zip

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

f1 : TextFile;


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.


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 (http://delphi.cjcsoft.net/viewthread.php?tid=42806) enlace donde proponen dos rutinas para convertir...

Saludos cordiales

oscarac
19-06-2019, 23:49:36
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.


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 (http://delphi.cjcsoft.net/viewthread.php?tid=42806) 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

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:


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


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:


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