Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Ayuda con archivo .tmp (https://www.clubdelphi.com/foros/showthread.php?t=74702)

pelikno 06-07-2011 01:13:29

Ayuda con archivo .tmp
 
Resulta que tengo que leer un archivo que no se que es, la extension es .tmp
declare un textFile y cuando leo con readln(File,Str) ,me lee todo el contenido como string, un ejemplo es asi 2344323454NANINO#$A23442455987887NINODI#$A
el tema es que no puedo identificar que caracter es #$A ya que recorro el string


Código:

while tot <=  (Length(str)) do
    begin
    if str[tot] = '#$A' then
        begin
        tot:= tot + 3 ;
        memo1.Lines.Add(aux);
        aux:= '';

        end
        else
        begin
        int:= Ord(str[tot]) ;

        aux:=aux + str[tot];
        tot := tot + 1;
        end;
    end;

Asi recorro el string pero resulta que cuando pregunto por # no lo identifica directamente agrega '#$A' como si fuera un solo caracter.
el formato del archivo es
numerocuilOtros#$AnumerocuilOtros#$AnumerocuilOtros#$A
No puedo identificar el separador de los camposo sea que tipo de caracter es.
En el if probe con comparar con # y no funciono,pregunte por #$A y tampoco.
Supongo que es un cambio de parrafo o algo asi pero no lo puedo identificar.
Si lo abro con notepad me muestra un string con todos los datos de corrido y en cambio el Word me los separa y me coloca un campo por linea como si reconociera el cambio de linea que indica #$A.
Si alguien tiene alguna idea sera de mucha ayuda ya que no se tampoco si declare el archivo como textfile o file of byte, correctamente.
Gracias!!!

Lord Delfos 06-07-2011 01:42:51

¿Un salto de linea? Parece un enter de un sistema no-Windows. Delphi te lo está mostrando así porque es un caracter no imprimible (el 10, o $A, notación para hexadecimal A)

En Windows un salto de linea es #10#13. #10 solo es propio de ambientes Unix según entiendo.

Debe ser por eso que el readln te lee todo entero, porque no reconoce #10 como enter completo (salto de linea + retorno de carro).

Yo trataría de leer con otra función. Si mal no recuerdo, la clase TStringList tenía un método que te generaba una TStringList con texto separado por un separador que uno indicara (en tu caso el #10).

Espero te sirva.

Saludos.

EDIT: Quizás también te convendría abrir el archivo con un editor hexadecimal, para ver bien cómo es por dentro. La versión de prueba del WinHex es altamente recomendable.

pelikno 06-07-2011 02:57:39

Cita:

Empezado por Lord Delfos (Mensaje 405603)
¿Un salto de linea? Parece un enter de un sistema no-Windows. Delphi te lo está mostrando así porque es un caracter no imprimible (el 10, o $A, notación para hexadecimal A)

En Windows un salto de linea es #10#13. #10 solo es propio de ambientes Unix según entiendo.

Debe ser por eso que el readln te lee todo entero, porque no reconoce #10 como enter completo (salto de linea + retorno de carro).

Yo trataría de leer con otra función. Si mal no recuerdo, la clase TStringList tenía un método que te generaba una TStringList con texto separado por un separador que uno indicara (en tu caso el #10).

Espero te sirva.

Saludos.

EDIT: Quizás también te convendría abrir el archivo con un editor hexadecimal, para ver bien cómo es por dentro. La versión de prueba del WinHex es altamente recomendable.

Gracias por tu ayuda, voy a ver que pasa pero espero mas ideas...

pelikno 06-07-2011 12:59:23

WinHex
 
Lo pude abrir con win ex y lo que en delphi me tira #$A en WinHex me muestra un espacio en blanco. como puedo hacer para abrir ese hexadecimal desde delphi.

pelikno 06-07-2011 18:07:19

Solucionado!!!
 
encontre la solucion gracias !!!
Código:

Reset(myFile);
  Memory.Active:=true;

 
  while not Eof(myFile) do
  begin
   
   
    text:='';
    while length(text) < 21 do
    begin
      Read(myFile, letter) ; 
      text:=text + letter ;

    end;
    Read(myFile, letter);
    Memory.Append;   
    Memorycuil.Value :=copy(text,1,2)+'-'+copy(text,3,8)+'-'+copy(text,11,1);
    Memoryganancias.Value:=copy(text,12,2);
    Memoryiva.Value:=copy(text,14,2);
    Memorymonotibuto.Value:= copy(text,16,2);
    MemoryintegranteSo.Value:= copy(text,18,1);
    Memoryempleador.Value:=copy(text,19,1);
    MemoryactividadMono.Value:=copy(text,20,2);
    Memory.Post;
    end;



La franja horaria es GMT +2. Ahora son las 11:46:00.

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