Fim de arquivo inesperado

29/12/2009

2

Prezados, Em primeiro lugar peço desculpas pelo tamanho da mensagem, porém se faz necessário.   Obs: Eu não consegui descobrir como enviar anexo o arquivo objeto dessa solicitação de ajuda. Aqueles que se dispuserem a me ajudar, eu peço que enviem um email para jronaldo@ufpa.br, a fim de que eu possa enviar o referido arquivo.   Estou com um problema no processamento de um arquivo texto em delphi conforme descrição abaixo:   O arquivo contém 325 linhas. Somente as 194 primeiras são processadas. Em uma análise inicial se poderia afirmar que existe um cacarcter de fim de arquivo no final da linha 194, porém eu penso que não é o caso.   Utilizando um programa bem simples(código adiante) eu fiz algumas simulações com o objetivo de totalizar a quantidade de registros lidos. Os resultados apresentados são os mais diversos possiveis, senão vejamos:   Se o registro 194 for deletado o programa processa todo o arquivo (324 registros);   Se um ou mais registros antes do registro 194 forem deletados o programa processa todo o arquivo;   Se um ou mais registros após o registro 194 forem deletados o programa não processa todo o arquivo(somente 194 registros);   Se aleatoriamente forem deletados o caracteres inválidos da palavra exercício de alguns registros antes do registro 194, o programa não processa todo o arquivo, apresentando totalizações diferentes de registros processados;   Se aleatoriamente forem deletados o caracteres inválidos da palavra exercício de alguns registros após o registro 194, o programa não processa todo o arquivo, apresentando sempre a mesma totalização(194 registros processados);   Se todos os caracteres inválidos da palavra exercício forem deletados o programa processa todo o arquivo;   Se qualquer caracter de um registro for deletado o resultado apresenta totalizações diferentes, dependendo do registro onde houve a deleção. Por exemplo: Registro 1:                    145 registros processados Registro 100:                145 registros processados Registro 130:                145 registros processados Registro 140:                145 registros processados Registro 145:                145 registros processados Registro 146:                325 registros processados Registro 150:                325 registros processados Registro 159:                325 registros processados Registro 190:                325 registros processados Registro 193:                325 registros processados Registro 194:                325 registros processados Registro 195:                194 registros processados Registro 239                 194 registros processados Registro 285:                194 registros processados Registro 320:                194 registros processados Registro 325:                194 registros processados   Se qualquer caracter de um registro for deletado, independente de qual registro, a totalização apresenta sempre o mesmo resultado(194 registros processados); O problema é que eu preciso justificar tecnicamente o que está acontecendo, ou seja, o que está escondido nesse arquivo que está impedindo de processá-lo na sua totalidade(325 registros). Sinceramente não sei como fazê-lo. Código do programa   unit URel_SISTUFA; interface uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Qrctrls, quickrpt, ExtCtrls, StdCtrls, Spin, Db, DBTables; type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end; var
  Form1: TForm1;
  Arquivo1: TextFile;
  Linha1: string;
  Total_Lido: Integer; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject);
begin
   Total_Lido:= 0;
   AssignFile(Arquivo1,'RejeitadoZC66926239.txt');
   Reset(Arquivo1);
   while not EOF(Arquivo1) do
   begin
      readln(Arquivo1,Linha1);
      Total_Lido:= Total_Lido + 1;
   end;
   Showmessage('Processados: ' + IntToStr(Total_Lido));
end; end.   Um amigo meu desenvolveu uma solução que funcionou(transcrita abaixo), porém eu preciso justificar o motivo de não ter funcionado com o código transcrito acima.unit URel_SISTUFA; interface uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Qrctrls, quickrpt, ExtCtrls, StdCtrls, Spin, Db, DBTables, ComCtrls; type
  TForm1 = class(TForm)
    Button1: TButton;
    RichEdit1: TRichEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end; var
  Form1: TForm1;
  Arquivo1: File;
  Total_Lido: Integer; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject);
var AByteFile: file of Byte;
    RecSize: Word;
    Buf: array[1..175] of Char;
    NumRead: Integer;
begin
   Total_Lido:= 0;
   RecSize:= 174;
   AssignFile(Arquivo1,'RejeitadoZC66926239.txt');
   Reset(Arquivo1,1);
   repeat
        BlockRead(Arquivo1, Buf, SizeOf(Buf), NumRead);
        Total_Lido:= Total_Lido + 1;
        RichEdit1.Lines.Add(IntToStr(Total_lido) + '-' +buf);
   until (NumRead = 0);    Showmessage('Processados: ' + IntToStr(Total_Lido)); end; end. Obrigado àqueles que me ajudarem. Jorge Ronaldo.      
Responder

Posts

04/01/2010

Pjrm1470

1. Amigo, o codigo de sua Unit so tem uma procedure onde conta quantas linhas tem. Cade o codigo de leitura para que possamos analizar onde poderia estar o erro? 2. Se puder edite o arquivo e copie apenas as linhas de 180 a 200. Não irá ocupar muito o espaço e pelo menos saberemos o conteúdo do arquivo. Ps.:"Se a linha for muito grande não a edite, apenas copie e cole aqui no forum mesmo, saberei analizar as linhas de acordo com a questão numero 1 citado acima".   Att pjrm1470.
Responder

04/01/2010

Jorge Ramos

Caro Plínio,

Se eu considerar apenas os registros 180 a 200 ele processa todos eles sem problema.

Seria bom que você pudesse ter acesso a todo o arquivo com os 325 registros. Reitero que eu não sei como encaminhá-lo. Se você me passar um email eu vou poder mandá-lo zipado. Quanto ao programa (o primeiro) é exatamente isso, ou seja, apenas conta quantos registros tem no arquivo. Nas diversas simulações que fiz os resultados são diversos. Ora processa somente uma parte, ora processa todo o arquivo, de acordo com as intervenções realizadas no mesmo.

O meu email é jronaldo@ufpa.br

Ats,

Jorge Ronaldo.


Responder

05/01/2010

Pjrm1470

Como eu informei pelo e-mail, também deixarei aqui a solução.  No arquivo em algumas linhas encontra-se um caractere parecido com uma seta. Ela está no lugar do acento no I que no caso é o acontecido do nosso amigo. No Delphi o comando ReadLn() interpreta essa setinha como se a linha fosse vazia ou como se fosse um enter, e pula para a proxima linha.  Muito cuidado com esses acontecidos. Espero que tenha ajudado. Qualquer problema volte a postar.

Att, pjrm1470.
Responder

05/01/2010

Jorge Ramos

Plinio, infelizmente o problema não é no () da palavra EXERCCIO porque se você deletar um ponto (.) que está no final da linha 183 você vai ver que o programa processa todas as 325 linhas. E é claro que o problema não é também por causa desse ponto. E agora?
Responder

05/01/2010

Pjrm1470

farei mais testes, favor aguardar. enquanto isso, se tiver ideias...
Responder
Você poderia mandar uma cópia desse arquivo para: martinsbios@gmail.com, irei analisá-lo também. Boa sorte e bons códigos. 
Responder

05/01/2010

Jorge Ramos

ok, vou mandar pro email citado.
Responder