Página 2 de 2

Enviado: 22 Jun 2007 11:13
por Maligno
Eolo escreveu:Eu faria como já foi dito acima: ler linha a linha do TXT, isolar cada campo, testar a consistência de cada um (no caso das datas, por ex, confirmar que não tem nenhuma "vazia" ou incorreta), e depois fazer o APPE BLAN e REPL...
Quando tiver um tempo maior, vou isolar um conjunto de funções que fiz pra isso e disponibilizá-lo na seção de códigos fontes.
É um sub-sistema completo para manipulação de texto. Uso pra tudo: importação, preview de relatórios, etc. Com ele posso abrir, ler, analisar, converter, etc.. de forma automática. Além disso, as linhas são separadas e indexadas. Assim, acesso qualquer uma como se fosse um registro de DBF. Tenho inclusive um controle de áreas, para abrir vários TXTs ao mesmo tempo.

Um exemplo de uso para o caso do Grings:

Código: Selecionar todos

function ImportDat()
local bPreGet := {|s|SubStr(s,15,8)} // um filtro
local cData
local i
txOpen("c:\teste.txt",bPreGet)
*
for i := 1 to txLines()
    cData := txGetLine(i) // só virá a data
    //
    // Neste ponto seria feita a conversão e gravação no DBF
    //
next
txClose()
Já levando em consideração os SETs necessários, claro. :)

Enviado: 22 Jun 2007 11:25
por sygecom
Maligno escreveu:
sygecom escreveu:Realmente Maligno....vc tem razão...eu deveria esta bem distraido....talvez cansado....afinal jah era 21:30 da noite...eu tava desde cedo na luta....
A essa hora,... Sei bem como é. Estou trabalhando todos os dias até 3 ou 4 da manhã. Quando chega nesse ponto é fácil perder a concentração. Mais cedo ou mais tarde será você a me corrigir numa outra thread qualquer. E aceitarei sua intervenção humildemente.
mas o que me deixa....as vezes com má impressão de vossa senhoria é que vc tenta tripudiar....em cima dos outros
Não tripudiei coisa alguma. Foi impressão sua. Apenas estranhei um código desse tipo partindo de "Vossa Senhoria". Considere essa última observação um elogio. :)
Ok...Maligno...desculpa a má impressão...equivoquei-me com vossa pessoa..

Abraços
Leonardo Machado

Enviado: 22 Jun 2007 11:30
por Maligno
sygecom escreveu:Ok...Maligno...desculpa a má impressão...equivoquei-me com vossa pessoa..
Não precisa se desculpar. Equívocos acontecem naturalmente num ambiente em que a única forma de comunicação é a palavra escrita, através da qual é impossível expressar-se fielmente, como se faria na palavra falada.
Eu nem esquento, pois sei que você é do bem, assim como eu. :)

Enviado: 22 Jun 2007 11:34
por sygecom
Maligno escreveu:
Eolo escreveu:Eu faria como já foi dito acima: ler linha a linha do TXT, isolar cada campo, testar a consistência de cada um (no caso das datas, por ex, confirmar que não tem nenhuma "vazia" ou incorreta), e depois fazer o APPE BLAN e REPL...
Quando tiver um tempo maior, vou isolar um conjunto de funções que fiz pra isso e disponibilizá-lo na seção de códigos fontes.
É um sub-sistema completo para manipulação de texto. Uso pra tudo: importação, preview de relatórios, etc. Com ele posso abrir, ler, analisar, converter, etc.. de forma automática. Além disso, as linhas são separadas e indexadas. Assim, acesso qualquer uma como se fosse um registro de DBF. Tenho inclusive um controle de áreas, para abrir vários TXTs ao mesmo tempo.

Um exemplo de uso para o caso do Grings:

Código: Selecionar todos

function ImportDat()
local bPreGet := {|s|SubStr(c,15,8)} // um filtro
local cData
local i
txOpen("c:\teste.txt",bPreGet)
*
for i := 1 to txLines()
    cData := txGetLine(i) // só virá a data
    //
    // Neste ponto seria feita a conversão e gravação no DBF
    //
next
txClose()[/close]

Já levando em consideração os SETs necessários, claro. :)[/quote]

Legal da sua parte compartilhar uma ferramenta assim.
Queria deixar registrado tb um simples exemplo que um colega postou que não tem mistério algum, de como usar um TXT no TBROWSE e que acho muito bom mas pode ser melhorada tb. é o do link abaixo:
https://pctoledo.org/forum/viewtopic.php?t=3954

Abraços
Leonardo Machado

Enviado: 22 Jun 2007 12:33
por Maligno
Esqueci de dizer que há outra forma, talvez mais fácil, para ler o arquivo como se fosse um DBF:

Código: Selecionar todos

function ImportDat()
local bPreGet := {|s|SubStr(s,15,8)} // um filtro
local cData
local i
txOpen("c:\teste.txt",bPreGet)
while !txEoF()
    cData := txGetLine(i) // só virá a data
    txSkip()
next
txClose()
Um exemplo de cópia desta mesma data em outro arquivo texto, dispensando a variável intermediária. Duas áreas são abertas. A primeira abre (opcionalmente, cria) um arquivo destino na área "DESTINO". A segunda área conterá o arquivo fonte. Como será a última ser aberta, esta área será a default. Pela malha a data será lida do arquivo fonte e gravada na área destino, ao final do arquivo, sendo uma em cada linha (EOL automático).

Código: Selecionar todos

function CopyDat()
local bPreGet := {|s|SubStr(s,15,8)} // um filtro
txOpen("c:\arq2.txt",,"DESTINO")     // não requer um filtro, claro
txOpen("c:\arq1.txt",bPreGet)        // área default: não requer um nome
while !txEoF()
    txAppend(txGetLine(),"DESTINO")  // o par 13/10 é automático
    txSkip()
next
txCloseAll()
Esta forma de trabalho com diversas áreas não me foi útil. Fiz porque um dia precisei. Mas essa necessidade não se cumpriu, pois houve uma mudança no projeto. Mas a característica ficou pronta e está aí.

Detalhe: o tamanho de cada arquivo está limitado a +/- 78MB com, no máximo, 16384 linhas. Até parece muito, mas acho que não é. Num relatório de 66 linhas por página, serão 248 páginas. Não é pouco, mas também não é muito. Mas isso pode ser melhorado.
Essas limitações existem por causa do sistema de indexação, que é o que me permite ter flexibilidade, como por exemplo: txSkip(-195) volta o ponteiro 195 linhas sem qualquer tipo de cálculo ou procura. É um salto direto pela atribuição de 195 a uma variável interna. Ou seja, é instantâneo, ao contrário do preview que utiliza TBrowse, que precisa procurar os 195 pares 13/10 anteriores, até chegar ao ponto desejado.