Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Converter Txt > Paradox


Eder

Pergunta

Ola...tou testando um codigo pra gerar dados de um *.txt para *.db(paradox)

O codigo que estou usando eu configurei e ele importe certinho, exceto pelo seguinte...ele importa de traz para frente em relação ao *.txt, ou seja ele começa a pegar os dados do final do *.txt

alguém sabe porque ele faz isto e como corrigir este pequeno probleminha..

o Codigo que estou usando é este:

procedure TForm1.Button2Click(Sender: TObject);
var
Txt : TextFile;
Entrada : String;
begin
Assignfile(Txt,'C:\MES\Clientes.Txt');
Reset(Txt);
While Not Eoln(Txt) do
begin
Readln(Txt, Entrada);
Table1.Insert;
    Table1.FieldByName('ordem').Value := Trim(Copy(Entrada,10,06));
    Table1.FieldByName('nome').Value := Trim(Copy(Entrada,16,42));
    Table1.FieldByName('cnpj').Value := Trim(Copy(Entrada,58,18));
    Table1.Post;
end;
CloseFile(Txt);
end;

Grato

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0

Oi, Eder!

Modifique seu código para que fique assim:

procedure TForm1.Button2Click(Sender: TObject);
var
   Txt : TextFile;
   Entrada : String;
begin
   Assignfile(Txt,'C:\MES\Clientes.Txt');
   Reset(Txt);
   Readln(Txt, Entrada); //a primeira leitura fica fora do while
   While Not Eof(Txt) do // O teste é de final de arquivo e não de fim de linha como antes
   begin
      Table1.Insert;
    Table1.FieldByName('ordem').Value := Trim(Copy(Entrada,10,06));
    Table1.FieldByName('nome').Value := Trim(Copy(Entrada,16,42));
    Table1.FieldByName('cnpj').Value := Trim(Copy(Entrada,58,18));
    Table1.Post;
      Readln(Txt, Entrada); // As leituras seguintes ficam na última linha antes do final do while
   end;
   CloseFile(Txt);
end;

Link para o comentário
Compartilhar em outros sites

  • 0
O codigo que estou usando eu configurei e ele importe certinho, exceto pelo seguinte...ele importa de traz para frente em relação ao *.txt, ou seja ele começa a pegar os dados do final do *.txt

Eder, apenas explicando a origem do problema: é que você utilizou EOLN (End Of LiNe) ao invés de EOF (End Of File).

Modifique seu código para que fique assim:

...

Denis Courcy, faz tempo que não implemento este tipo de leitura, então vou perguntar para tirar a dúvida: da forma como você sugere - fazer o Readln ao final do laço - não irá acontecer de a última linha deixar de ser processada, já que a úlima linha é lida e o sinalizador de EOF "encontrado"?

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Modifique seu código para que fique assim:

...

Denis Courcy, faz tempo que não implemento este tipo de leitura, então vou perguntar para tirar a dúvida: da forma como você sugere - fazer o Readln ao final do laço - não irá acontecer de a última linha deixar de ser processada, já que a úlima linha é lida e o sinalizador de EOF "encontrado"?

Abraços

Oi, Micheus!

A resposta a seu questionamento é não.

As regras para leitura de arquivo de forma estruturada, usando laço while (validas para qualquer linguagem) determinam:

1 - A leitura antes (a do primeiro registro) do laço while. Para certificar que o buffer entre, carregado, no laço (veja a explicação abaixo)

2 - A leitura na última posição do laço while. Para forçar que o buffer esteja carregado antes de fazer o teste para a continuidade do laço.

Explicação:

Quando o arquivo não possui registro o que é lido é a marca de EOF (caracter CTRL Z ou chr(26) nos arquivos texto) e uma informação é emitida avisando que o EOF foi encontrado.

O mesmo acontece quando, em um arquivo que contém registros, após a última leitura, o EOF é encontrado.

Nos arquivos binários o teste é feito comparando o ponteiro de deslocamento do arquivo com o tamanho do mesmo informado na tabela de diretório.

Quando a marca de EOF é encontrada o buffer retornará vazio e/ou parcialmente cheio.

O arquivo texto informado pelo Eder tem a seguinte composição:

<<<<string>>>> EOL

<<<<string>>>> EOL

EOF

Há casos em que o arquivo texto pode vir assim:

<string1>,<string2>,<string3>,...,<stringN>EOF

Mas este é outro tópico.

Para saber:

EOL = Marca de fim de linha = #13#10

EOF = Marca de fim de arquivo = #26.

Nos arquivos binários o EOF é #255.

Link para o comentário
Compartilhar em outros sites

  • 0

Valeu..Pessoal :)

Obrigado pela ajuda.

haaa....com o codigo que o Deniz passou em fiz o teste:

Denis Courcy, faz tempo que não implemento este tipo de leitura, então vou perguntar para tirar a dúvida: da forma como você sugere - fazer o Readln ao final do laço - não irá acontecer de a última linha deixar de ser processada, já que a úlima linha é lida e o sinalizador de EOF "encontrado"?

R. Micheus...respondendo a pergunta, pois eu fiz o testezinho, funcionou certinho.....eu tinha um arquivo texto de 30 linhas e ele processou certinho todos as linhas. :D

Abraço

t+

t+

Link para o comentário
Compartilhar em outros sites

  • 0
As regras para leitura de arquivo de forma estruturada, usando laço while (validas para qualquer linguagem) determinam:

1 - A leitura antes (a do primeiro registro) do laço while. Para certificar que o buffer entre, carregado, no laço (veja a explicação abaixo)

2 - A leitura na última posição do laço while. Para forçar que o buffer esteja carregado antes de fazer o teste para a continuidade do laço.

Explicação:

Quando o arquivo não possui registro o que é lido é a marca de EOF (caracter CTRL Z ou chr(26) nos arquivos texto) e uma informação é emitida avisando que o EOF foi encontrado.

O mesmo acontece quando, em um arquivo que contém registros, após a última leitura, o EOF é encontrado.

Denis Courcy, fiquei intrigado com esta afirmação, porque, como disse, já faz algum tempo que não precisei implementar este tipo de rotina.

Entretanto, estava quase certo de que ocorreria o que mencionei (justamente porque na época, pareceu-me que passei por esta situação). Assim, para não ficar com a bendita da dúvida, implementei este exemplo simples (ver anexo). Observe os resultados.

Abraços

Importacao.zip

Link para o comentário
Compartilhar em outros sites

  • 0

Oi, Micheus!

Você enviou o código que está com erro assim:

...
  Assignfile(Txt,'Arquivo.csv');
  Reset(Txt);
  Readln(Txt, Entrada);
  While Not EOF(Txt) do
  begin
    ListBox2.Items.Add(Entrada);
    Application.ProcessMessages;
    Readln(Txt, Entrada);
    Label2.Caption := Entrada;
  end;
  CloseFile(Txt);
Porém, Se você fizer assim:
...
  Assignfile(Txt,'Arquivo.csv');
  Reset(Txt);
  Readln(Txt, Entrada);
  While Not EOF(Txt) do
  begin
    Label2.Caption := Entrada;
    ListBox2.Items.Add(Entrada);
    Application.ProcessMessages;
    Readln(Txt, Entrada);
  end;
  CloseFile(Txt);

Você não terá erros. Pois como mensionei anteriormente a segunda leitura deve ser a última instrução antes do end do bloco while

Link para o comentário
Compartilhar em outros sites

  • 0
Você enviou o código que está com erro assim:...

A posição do Label2 não é relevante para a questão. Eu coloquei propositalmente naquela posição justamente para que ele refletisse o conteúdo da última linha lida, logo tinha que ser após o readln. Veja que ser no último readln, não houve o que ler (fosse o suposto EOF encontrado) a variável linha, supostamente (não tenho certeza) deveria estar vazia.

De qualquer modo, o relevante é você observar a lista. Não é à toa que ela é movida para seu fim. Observe a última linha inserida (veja o anexo). Ela representa a última linha que seria inserida na tabela, já que está na mesma posição que a proposta.

Abraços

post-12746-1204828362.jpg

Link para o comentário
Compartilhar em outros sites

  • 0

Corrigindo:

haaa....com o codigo que o Deniz passou em fiz o teste:

QUOTE

Denis Courcy, faz tempo que não implemento este tipo de leitura, então vou perguntar para tirar a dúvida: da forma como você sugere - fazer o Readln ao final do laço - não irá acontecer de a última linha deixar de ser processada, já que a úlima linha é lida e o sinalizador de EOF "encontrado"?

R. Micheus...respondendo a pergunta, pois eu fiz o testezinho, funcionou certinho.....eu tinha um arquivo texto de 30 linhas e ele processou certinho todos as linhas.

Eu fiz o teste de maneira incorreta acredito, pois fiz novamente e realmente aconteceu o que o Micheus mencionou, a ultima linha do arquivo ele não processa(não importa);

Então fiz as modificações conforme comentários que peguei aqui no post e o codigo funcionou corretamente assim:

procedure TFormTXTDB.XiButton4Click(Sender: TObject);
var
   Txt : TextFile;
   Entrada : String;
begin
   Assignfile(Txt,'C:\MES\Clientes.Txt');
  Reset(Txt);
While Not Eof(Txt) do
begin
Readln(Txt, Entrada);
Table1.Insert;
    Table1.FieldByName('ordem').Value := Trim(Copy(Entrada,10,06));
    Table1.FieldByName('nome').Value := Trim(Copy(Entrada,16,42));
    Table1.FieldByName('cnpj').Value := Trim(Copy(Entrada,58,18));
    Table1.Post;
end;
CloseFile(Txt);
END;
Resumindo: o codigo ficou igual ao que eu havia postado inicialmente......exceto trocando esta linha:
While Not Eoln(Txt) do
Por esta:
While Not Eof(Txt) do

ou seja trocando EOLN por EOF

valeu..pessoal muito grato pela ajuda...

abraço a todos.

t+

Editado por Eder
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...