Jump to content
Fivewin Brasil

como saber (rapido) o numero de linhas de um mega arquivo.txt


gibaf

Recommended Posts

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

Link to comment
Share on other sites

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)

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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 ?

Link to comment
Share on other sites

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:

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 !

Link to comment
Share on other sites

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 !

Link to comment
Share on other sites

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
/**********************************************************/

Link to comment
Share on other sites

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
/**********************************************************/

Link to comment
Share on other sites

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 );
}

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...