gibaf Posted October 25, 2013 Report Share Posted October 25, 2013 Ola a todos... Tenho um mega arquivo txt q nem abre pelo textpad, de tao grande q eu. tem 2.965.241 KB, com mais de 180 milhoes de linhas... e estou precisando saber o numero de linhas (nao o tamanho) q o arquivo tem. ja usei o HB_FUse, pra dae, usar HB_FLastRec pra saber qual eh o numero de linha de um arquivo txt.... tambem ja tentei o HB_FGoBottom() + HB_FRecno() pra ter essa informacao.... mas fica muito lento o HB_FLastRec() e o HB_FGoBottom(), pq o arquivo txt eh muito grande, ja tinha tentado tambem o FLineCount, mas tambem muito lento pra dar o resultado alguem tem alguma dica pra saber quantas linhas tem o arquivo bem rapido ?? talvez ate algum comando do ms-dos ? desde ja agradeco a ajuda q vira: MUITO OBRIGADO Quote Link to comment Share on other sites More sharing options...
emotta Posted October 25, 2013 Report Share Posted October 25, 2013 tem duas opções, primeiro as linhas tem sempre o mesmo numero numero de bytes? Se sim basta dividar os bytes total do arquivo pela quantidade de bytes da linha. Caso as linhas nao use o codigo abaixo (mas que vai consumir memoria) cTexto := MemoRead(cFile) aLinhas := HB_aTokens(cTexto,Chr(13)) // caso nao dê certo com CHR(13) tente só CHR(10) nLinhas := Len(aLinhas) Quote Link to comment Share on other sites More sharing options...
emotta Posted October 25, 2013 Report Share Posted October 25, 2013 Só uma dica, se vc precisa disso apenas pra fazer uma barra de progresso e se as linhas nao tem tamanho uniforme então faça a barra de progresso pelos bytes lidos e não pelas linhas lidas... Quote Link to comment Share on other sites More sharing options...
Eduardo Bilato Posted October 25, 2013 Report Share Posted October 25, 2013 Também existe a possibilidade de saber utilizando a classe tTxtFile() com a propriedade nTLines EX: oFile := TtxtFile():New( '.\teste.txt' ) ? 'Número de linhas do arquivo',oFile:nTLines Quote Link to comment Share on other sites More sharing options...
gibaf Posted October 25, 2013 Author Report Share Posted October 25, 2013 tem duas opções, primeiro as linhas tem sempre o mesmo numero numero de bytes? Se sim basta dividar os bytes total do arquivo pela quantidade de bytes da linha. Caso as linhas nao use o codigo abaixo (mas que vai consumir memoria) cTexto := MemoRead(cFile) aLinhas := HB_aTokens(cTexto,Chr(13)) // caso nao dê certo com CHR(13) tente só CHR(10) nLinhas := Len(aLinhas) obrigado por responder.... ja tinha tentado esse, mas eh muito grande e nao abre com o MemoRead.. se alguem tiver mais alguma dica, por favor, me envie... OBRIGADO Quote Link to comment Share on other sites More sharing options...
gibaf Posted October 25, 2013 Author Report Share Posted October 25, 2013 Também existe a possibilidade de saber utilizando a classe tTxtFile() com a propriedade nTLines EX: oFile := TtxtFile():New( '.\teste.txt' ) ? 'Número de linhas do arquivo',oFile:nTLines obrigado por responder.... ja tinha tentado esse, mas eh muito grande e nao abre com o TtxtFile.. se alguem tiver mais alguma dica, por favor, me envie... OBRIGADO Quote Link to comment Share on other sites More sharing options...
emotta Posted October 25, 2013 Report Share Posted October 25, 2013 o negócio então é fazer um calculo estimado ou se voce precisa disso pra fazer uma barra de progresso controlar a barra pelo numero de bytes lidos e nao pelas linhas lidas... abraços e boa sorte Quote Link to comment Share on other sites More sharing options...
Arthur Silvestre Posted October 25, 2013 Report Share Posted October 25, 2013 o negócio então é fazer um calculo estimado ou se voce precisa disso pra fazer uma barra de progresso controlar a barra pelo numero de bytes lidos e nao pelas linhas lidas... abraços e boa sorte Me interessei sobre isso, teria algum exemplo ? Quote Link to comment Share on other sites More sharing options...
kapiaba Posted October 25, 2013 Report Share Posted October 25, 2013 http://www.baixaki.com.br/categorias/384-editores-para-programacao.htm Quote Link to comment Share on other sites More sharing options...
gibaf Posted October 25, 2013 Author Report Share Posted October 25, 2013 o negócio então é fazer um calculo estimado ou se voce precisa disso pra fazer uma barra de progresso controlar a barra pelo numero de bytes lidos e nao pelas linhas lidas... abraços e boa sorte ola... obrigado por estar respondendo... mas, nao eh pra fazer barra de rolagem (pensando bem, ate seria util pra isso tambem - hehe) nao tem nenhum comando do ms-dos q faz rapido ? Quote Link to comment Share on other sites More sharing options...
Arthur Silvestre Posted October 25, 2013 Report Share Posted October 25, 2013 ola... obrigado por estar respondendo... mas, nao eh pra fazer barra de rolagem (pensando bem, ate seria util pra isso tambem - hehe) nao tem nenhum comando do ms-dos q faz rapido ? Amigo, poderia me passar o txt ? eu testaria aqui e diria a você como pode ser feito. Quote Link to comment Share on other sites More sharing options...
kapiaba Posted October 25, 2013 Report Share Posted October 25, 2013 ESTE ABRE + DE 3GB, http://www.swiftgear.com/ltfviewer/features.html Em clipper: http://www.pctoledo.com.br/forum/viewtopic.php?f=43&t=13626 http://www.pctoledo.com.br/forum/viewtopic.php?f=43&t=11703&p=66937#p66937 ABS, Quote Link to comment Share on other sites More sharing options...
gibaf Posted October 25, 2013 Author Report Share Posted October 25, 2013 obrigado por responder...por mais q acho q vc nao esta lendo o q esta sendo escrito nos topicos...hehe... mas tudo bem.. o q vale muito e as dicas, q apartir delas, mesmo q nao for exatamente o q estou querendo, talvez de opcao pra pensar numa linha diferente...hehehe ESTE ABRE + DE 3GB, http://www.swiftgear.com/ltfviewer/features.html Em clipper: http://www.pctoledo.com.br/forum/viewtopic.php?f=43&t=13626 http://www.pctoledo.com.br/forum/viewtopic.php?f=43&t=11703&p=66937#p66937 ABS, a questao nao eh abrir... isso ja estou fazendo, mesmo o arquivo ser grande.. e nem mostrar quantas linhas tem o txt... tem varios comandos/funcoes q fazem isso, mas, pelo fato do arquivo ser muito grande, mais de 180 MILHOES de linhas, demora muito pra mostrar.. e, veja, nao quero extrair o conteudo de nenhuma linha... somente quero saber quantas linhas tem o txt, de forma rapida (se o txt for pequeno isso acontece, mas nao esta acontecendo com esse MEGA arquivo) obrigado +1x. Quote Link to comment Share on other sites More sharing options...
gibaf Posted October 25, 2013 Author Report Share Posted October 25, 2013 geralmente os comandos do ms-dos sao muito rapidos... alguem lembra algum comando do ms-dos q mostra o numero de linhas de um arquivo texto ? obrigado Quote Link to comment Share on other sites More sharing options...
evertonlb Posted October 25, 2013 Report Share Posted October 25, 2013 caro amigo gibaf, este arquivo na hora que é gerado não tem como incluir o numero das linhas? Não tem como colocar no nome dele o numero de linhas?? Pensei que se fosse gerado por alguém que você tenha acesso, poderia pedir para colocarem no nome do arquivo o numero de linhas. mesmo tendo que gerar todo o arquivo para saber o numero exato, depois de saber é só um rename() e já estaria ai... Presumo que se você esta pensando numa solução é porque isso acontecerá muitas vezes, então continuarei pensando em algo, mas por enquanto só isso que me ocorreu! tem o comando type do MSDos, mas não sei como poderia usa-lo! A não ser que tenha alguma propriedade não documentada! Att. Quote Link to comment Share on other sites More sharing options...
gibaf Posted October 25, 2013 Author Report Share Posted October 25, 2013 caro amigo gibaf, este arquivo na hora que é gerado não tem como incluir o numero das linhas? Não tem como colocar no nome dele o numero de linhas?? Pensei que se fosse gerado por alguém que você tenha acesso, poderia pedir para colocarem no nome do arquivo o numero de linhas. mesmo tendo que gerar todo o arquivo para saber o numero exato, depois de saber é só um rename() e já estaria ai... Presumo que se você esta pensando numa solução é porque isso acontecerá muitas vezes, então continuarei pensando em algo, mas por enquanto só isso que me ocorreu! tem o comando type do MSDos, mas não sei como poderia usa-lo! A não ser que tenha alguma propriedade não documentada! Att. a sua sugestao eh boa... vou ver o q consigo muito obrigado ! Quote Link to comment Share on other sites More sharing options...
emotta Posted October 25, 2013 Report Share Posted October 25, 2013 Gibaf, faz um executavel em DELPHI que recebe como parametro o nome do arquivo e devolve pra voce as linhas. Delphi é absurdamente rapido pra tratar este tipo de situação. Veja ai um exemplo http://www.activedelphi.com.br/forum/viewtopic.php?p=200797&sid=47f8b825821e2fb829df63cc29455a05 abraços e boa sorte a sua sugestao eh boa... vou ver o q consigo muito obrigado ! Quote Link to comment Share on other sites More sharing options...
vagner Posted October 25, 2013 Report Share Posted October 25, 2013 Olá, Fiz um teste aqui com 52.909 linha em 1.22 segundos , acho q pode lhe ajudar Static func Teste()nSec := Seconds()nTot := My_Teste()? nTot,Seconds()-nSec Retu(.T.) #pragma BEGINDUMP#include <windows.h>#include <hbapi.h>#include <stdio.h> HB_FUNC ( MY_TESTE ){ FILE *sfile; int nresu; int nline = 0; if ((sfile = fopen("UltComPCNew.Txt","r+")) != NULL ) { while((nresu = fgetc(sfile)) != EOF){ if(nresu == '\n'){ // é uma quebra de linha? // vamos incrementar a quantidade de linhas nline++; } } fclose(sfile); } else nline = -1; hb_retni( nline );}#pragma ENDDUMP/**********************************************************/ Quote Link to comment Share on other sites More sharing options...
vagner Posted October 25, 2013 Report Share Posted October 25, 2013 Uma pequena melhorada no código #pragma BEGINDUMP#include <windows.h>#include <hbapi.h>#include <stdio.h> HB_FUNC ( MY_TESTE ){ FILE *sfile; int nresu; int nline = 0; char temp[2430]; if ((sfile = fopen("UltComPCNew.Txt","r+")) != NULL ) { while(fgets(temp, 2430, sfile) != NULL) { if((strstr(temp, "\n")) != NULL) { nline ++ ; } } fclose(sfile); } else nline = -1; hb_retni( nline );}#pragma ENDDUMP/**********************************************************/ Quote Link to comment Share on other sites More sharing options...
emotta Posted October 25, 2013 Report Share Posted October 25, 2013 guardarei este codigo muito bom abraços Quote Link to comment Share on other sites More sharing options...
emotta Posted October 25, 2013 Report Share Posted October 25, 2013 Função muito boa e ja implementei em nossa LIB padrão. Agora vamos mudar o código dos fontes para usar este codigo. Vagner só tomei a liberdade de mudar a funcao em C para receber o parametro na chamada, assim quem usar em (x)Harbour pode chamar LinhasFile("c:\arq.txt") e nao estar xumbado no codigo em C o nome do arquivo. Alguem do forum pode nao saber como se recebe parametro em um codigo C do xHarbour. Abraços e obrigado, foi bem util pra mim HB_FUNC ( LINHASFILE ){ FILE *sfile; int nresu; int nline = 0; if ((sfile = fopen(hb_parc( 1 ),"r+")) != NULL ) { while((nresu = fgetc(sfile)) != EOF){ if(nresu == '\n'){ // é uma quebra de linha? // vamos incrementar a quantidade de linhas nline++; } } fclose(sfile); } else nline = -1; hb_retni( nline );} Quote Link to comment Share on other sites More sharing options...
vagner Posted October 25, 2013 Report Share Posted October 25, 2013 Fala Edu, Esteja a vontade, eu montei somente para testar mesmo , por enquanto não estou usando , mas fico contente que tenha funcionado a contento Quote Link to comment Share on other sites More sharing options...
vagner Posted October 25, 2013 Report Share Posted October 25, 2013 Fala Edu, Esteja a vontade, eu montei somente para testar mesmo , por enquanto não estou usando , mas fico contente que tenha funcionado a contento P.S.: tente o outro código que postei pois é mais rápido que esse que vc postou Quote Link to comment Share on other sites More sharing options...
emotta Posted October 25, 2013 Report Share Posted October 25, 2013 Vlw Vagner, ja mudei aqui... abraços e bom final de semana, obrigado Quote Link to comment Share on other sites More sharing options...
SAOliveira Posted October 26, 2013 Report Share Posted October 26, 2013 Pena não retornar de .XML Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.