Ir para conteúdo


Foto

Contar Palavras de um arquivo de texto

contar palavras contar palavras txt texto

  • Por favor, faça o login para responder
18 respostas neste tópico

#1 Luis Henrique Veber

Luis Henrique Veber

    Novato

  • Membros
  • 1 posts
  • LocationCuritiba PR

Postado 27 abril 2017 - 02:03

Olá, Boa tarde,

 

Tenho dois arquivos de texto a.txt e b.txt, o que eu preciso é primeiramente contar quantos nomes tem em cada arquivo, segundo preciso percorrer cada linha do meu arquivo a.txt e comparar se já existe no b.txt, se já existir queria passar para a próxima  linha nesta comparação. Alguem tem algo parecido para me ajudar?



#2 joelson0007

joelson0007

    Administrador

  • Administradores (Adm)
  • PipPipPipPipPip
  • 895 posts
  • LocationGuarapuava - PR

Postado 28 abril 2017 - 03:39

Pelo que entendi você está procurando pelo algorítimo Levenshtein

 

Por favor Login ou se não possuir um conta Registre-se para ver o conteúdo escondido

 

É isso mesmo?

 

se for podemos implementar em autoit.

 

até mais.



#3 Manimal

Manimal

    Membro Nível 3

  • Administradores (Adm)
  • PipPipPipPip
  • 321 posts
  • LocationVideira/SC

Postado 28 abril 2017 - 06:10

Noooossa joelson0007.

 

Agora matou a pau! Fazia muito tempo que não ouvia falar desse algoritmo!!!  :o

 

Mas acho que ele quer algo mais simples, tipo:

  1. Ler arquivo A.TXT e armazenar os nomes em um vetor
  2. Ler arquivo B.TXT e armazenar os nomes em um vetor
  3. Limpar os vetores eliminando as duplicatas e classificando-os para facilitar a pesquisa binária (_ArrayUnique e _ArraySort)
  4. O tamanho dos vetores representa a quantidade de nomes em cada arquivo
  5. Fazer a varredura do vetor A (com loop) e procurar cada elemento no vetor B (_ArraySearch)

Algo assim... Mas sua sugestão é Top:600866:



#4 joelson0007

joelson0007

    Administrador

  • Administradores (Adm)
  • PipPipPipPipPip
  • 895 posts
  • LocationGuarapuava - PR

Postado 28 abril 2017 - 07:02

Pois é, estive implementando algo no mysql pra encontrar umas coisas, mesmo que usuário fizesse uma pesquisa errada, mas não saiu nada ainda  :mad2:

 

kkkkkkkk, analisando sua explicação, acho que isso mesmo que ele quer, vou ver o que sai :ninja:



#5 Pedro Pinheiro

Pedro Pinheiro

    Membro Nível 1

  • Membros
  • PipPip
  • 185 posts
  • LocationBrazil

Postado 29 abril 2017 - 11:46

Aproveitando o tópico. Estou com dificuldade de procurar um texto em um arquivo grande. Tipo o arquivo tem 20 mil linhas e eu quero achar uma palavra, e um loop que não encontra o texto normalmente vai ate a ultima linha isso demora muito. No notepad um ctrl+f vai direto no primeiro texto encontrado na hora. Existe alguma função que procura o 1 texto instantaneamente sem loop q nem o ctrl+f? Eu tenho uma array com 600 itens e preciso renomear os itens de acordo com o arquivo de 20 mil linhas. São 600 voltas de 20 mil voltas se eu usar um loop

Cada volta ate encontrar o valor demora seculo


Eu estou renomeando valores de uma array de acordo com o nome contido no arquivo game ( name kof20 description "the king 2000". Achei um modo com o stringRegExp e o nome the king eu pego com stringBtween. Alguem q entende sabe como eu encontro isso?

Editado por Pedro Pinheiro, 29 abril 2017 - 08:57 .


#6 Manimal

Manimal

    Membro Nível 3

  • Administradores (Adm)
  • PipPipPipPip
  • 321 posts
  • LocationVideira/SC

Postado 01 maio 2017 - 07:30

Olá Pedro.

 

Ficou um pouco confuso, deixa ver se eu entendi...

 

Vc tem um arquivo TXT com 20 mil linhas, teoricamente cada linha tem uma sigla (kof20) e o nome completo (the king 2000).

 

Daí tem um vetor contendo 600 siglas, as quais vc quer procurar no arquivo e recuperar o nome completo para poder renomear o arquivo original, isso?



#7 Pedro Pinheiro

Pedro Pinheiro

    Membro Nível 1

  • Membros
  • PipPip
  • 185 posts
  • LocationBrazil

Postado 02 maio 2017 - 07:19

Eu tenho um loop com uma array com a quantidade de itens de uma pasta. Eu quero listar esses arquivos em adicionar uma coluna com o nome verdadeiro desses itens
Exemplo:
Um dos itens da array "kof02.zip" no arquivo de texto eu pego o nome verdadeiro do arquivo exemplo de uma das 20 mil linhas - game kof.zip "the king 2002". Ai eu quero fazer um loop da quantidade de itens da array adicionando uma nova coluna...jaja eu termino de editar o texto...gkbpbom..eu usei o stringregexp para verifica se existe o nome vinculado no arquivo para evitar o loop de 20Mil.

 

Editado.

 

É dificil não perder o fio da linhada em uma tela minúscula que só da para ler 1 palavra por vez...enfim.

 

Um dos textos contido no arquivo com 20 mil linhas:

 

game ( name kf2k2mp description "The King of Fighters 2002 Magic Plus (bootleg)" )

 

Arquivo de uma pasta que vira array

 

kf2k2mp.zip

 

 

Objetivo. Procurar o nome da array no arquivo de texto e com o stringBetween obter o nome verdadeiro do arquivo para criar uma array 2D

Exemplo:

 

---Linhas contida nos arquivos--

game ( name kf2k2mp description "The King of Fighters 2002 Magic Plus (bootleg)" )

game ( name kf2k2mp2 description "The King of Fighters 2002 Magic Plus II (bootleg)" )

...

----------------------------------------

---Nova array 2D

Col 0              |  Col 1

kf2k2mp.zip    | The King of Fighters 2002 Magic Plus (bootleg)

kf2k2mp2.zip  | The King of Fighters 2002 Magic Plus II (bootleg)

...

 

 

 

Como eu fiz....StringRegExp verifica se a palavra Ex "kf2k2mp" está contida no arquivo e evita de entrar no loop. No loop eu vou da primeira até a ultima linha até achar a palavra que vem depois de "name" e "description"....o loop vai até a ultima linha do arquivo até achar a referencia do arquivo...Ai eu pego a linha encontrada...faço um stringBetween e pego o nome entre parentes e por fim escrevo na Array o nome encontrado. Bom...o problema disso tudo foi o tempo que o for demora ir até a linha correspondente do texto em questão...Eu tive a ideia de caso a linha esteja acima da quantidade maxima da array de files, então deletar a linha do arquivo de 30 mil linhas e criar uma array com os arquivos e depois de todo processo eu reescrevo as informações para o inicio do arquivo de texto evitando de futuras pesquisas demorem, mas nada foi eficiente...uma pasta com 150 arquivos demora quase 10 segundos para abrir. O iniread é tão eficiente, rápido e direto. Eu pensei em ler a biblioteca dele para estudar o modo que ele trabalhar, mas não encontrei nada referente nas pastas do autoit. Ai meio que perdi muitas horas até não obter um resultado concreto...sempre lentidão na leitura dos arquivos. Quando eu dou um Ctrl+F no bloco de notas, ele vai diretamente na palavra sem nenhum loop ou coisa do tipo.

Por favor Login ou se não possuir um conta Registre-se para ver o conteúdo escondido


Editado por Pedro Pinheiro, 02 maio 2017 - 11:35 .


#8 Manimal

Manimal

    Membro Nível 3

  • Administradores (Adm)
  • PipPipPipPip
  • 321 posts
  • LocationVideira/SC

Postado 02 maio 2017 - 10:28

Olá Pedro.

 

Calma criatura... ;) Termina o post...  :lol:

 

Tenta não pensar em loops e programação. Pense primeiro em modelo teórico de dados, no que tem e no que vc precisa.

 

A partir daí (do modelo), surgirá a melhor maneira de implementar esses dados, seja com array, banco de dados, variáveis, etc...

 

Começar pela programação direto é a pior maneira de resolver uma situação!

 

Estamos aqui pra ajudar, portanto preciso que vc me passe essas informações para que eu possa entender melhor o que vc tem e ajudar vc a encontrar a melhor solução!

 

Blz?



#9 Pedro Pinheiro

Pedro Pinheiro

    Membro Nível 1

  • Membros
  • PipPip
  • 185 posts
  • LocationBrazil

Postado 02 maio 2017 - 06:06

Olá Pedro.

 

Calma criatura... ;) Termina o post...  :lol:

 

Tenta não pensar em loops e programação. Pense primeiro em modelo teórico de dados, no que tem e no que vc precisa.

 

A partir daí (do modelo), surgirá a melhor maneira de implementar esses dados, seja com array, banco de dados, variáveis, etc...

 

Começar pela programação direto é a pior maneira de resolver uma situação!

 

Estamos aqui pra ajudar, portanto preciso que vc me passe essas informações para que eu possa entender melhor o que vc tem e ajudar vc a encontrar a melhor solução!

 

Blz?

 

Pronto. Tudo explicado ali em cima. Alias. Aqui em baixo tem um exemplo de como eu estou usando a array. Ao inves de listar o nome verdadeiro do arquivo "1941.zip" ele mostra o nome extraído daquele arquivo de texto de 20+ Linhas.

oWjabAd.png



#10 mutleey

mutleey

    AutoIt MVP

  • AutoIt MVPs (MVP)
  • PipPipPip
  • 277 posts
  • LocationSão José do Rio Preto-SP

Postado 02 maio 2017 - 06:30

o que vc esta usando? o lst do advmenu ou o xml do mame?



#11 Pedro Pinheiro

Pedro Pinheiro

    Membro Nível 1

  • Membros
  • PipPip
  • 185 posts
  • LocationBrazil

Postado 02 maio 2017 - 07:01

o que vc esta usando? o lst do advmenu ou o xml do mame?

 

O Lst. Ele é bem leve, só 2 megas. O xml pesa 30 megas.

 

Se o autoit for limitado para isso, então vou ter de usar aquele esquema em .ini que é aparentemente instantâneo. Só que isso vai gerar uma coisa bizarra de mais.

 

[Lista]
kof94=The King of Fighters '94
aof2=Art of Fighting 2 / Ryuuko no Ken 2 (set 1)
aof2a=Art of Fighting 2 / Ryuuko no Ken 2 (set 2)
wh2=World Heroes 2
fatfursp=Fatal Fury Special / Garou Densetsu Special (set 1)
fatfursa=Fatal Fury Special / Garou Densetsu Special (set 2)
savagere=Savage Reign / Fu'un Mokushiroku - kakutou sousei
fightfev=Fight Fever (set 1)
fightfva=Fight Fever (set 2)

 

 

EDITADO:

 

Outro problema. O iniReadSection cria uma array com no maximo 661 colunas :(

E não consegui abri o ini 1 vez só para leitura constante :(((

$File=FileOpen("D:\SCRIPTS AUTOIT\Projeto Frontend\MAME - Copia.lst")

$aArray = IniReadSection($File, "lista")

Não posso fazer um iniread em cada volta. Imagina só sei lá 5 mil iniread
 

 

aah! com o iniread o programa demorou 6 segundos para abrir com 600 itens com nomes atualizados. O mais rápido até agora.


Editado por Pedro Pinheiro, 03 maio 2017 - 06:05 .


#12 Belini

Belini

    Administrador

  • Administradores (Adm)
  • PipPipPipPipPip
  • 2.202 posts
  • LocationMinas Gerais

Postado 03 maio 2017 - 01:07

@Pedro pinheiro eu não sei se vc precisa que esta função esteja no seu script ou se quer renomear um arquivo apenas uma vez, caso seja a segunda opção vc pode renomear a extensão do arquivo de .lst para .au3 depois vai em search, replace, coloca a palavra que quer procurar e na linha de baixo pelo que quer trocar aí é só clicar em replace all que todas serão trocadas instantaneamente!



#13 Pedro Pinheiro

Pedro Pinheiro

    Membro Nível 1

  • Membros
  • PipPip
  • 185 posts
  • LocationBrazil

Postado 03 maio 2017 - 04:39

@Pedro pinheiro eu não sei se vc precisa que esta função esteja no seu script ou se quer renomear um arquivo apenas uma vez, caso seja a segunda opção vc pode renomear a extensão do arquivo de .lst para .au3 depois vai em search, replace, coloca a palavra que quer procurar e na linha de baixo pelo que quer trocar aí é só clicar em replace all que todas serão trocadas instantaneamente!

ah show. Eu fiz isso no bloco de notas mesmo

#14 Manimal

Manimal

    Membro Nível 3

  • Administradores (Adm)
  • PipPipPipPip
  • 321 posts
  • LocationVideira/SC

Postado 04 maio 2017 - 12:13

Olá Pedro.

 

Queria ter respondido antes, mas não deu tempo...

 

Pelo que entendi do sua explicação, vc leu os arquivos .ZIP de uma pasta (C:\PastaCom300Roms), carregou os nomes em um array ($PathRoms) e inseriu uma segunda coluna para os nomes. Até aqui show de bola!

 

Não sei se o script acima está correto ou é apenas para ilustrar sua idéia, mas veja que o IF que verifica a existência do arquivo Arcade.Lst está DENTRO do loop, ou seja, se o arquivo não existir não será feito nada, MAS será verificado a existência do arquivo para CADA nome do array. Coloque o IF para fora e vai economizar tempo e processamento (1o gargalo)!

 

Script original

Por favor Login ou se não possuir um conta Registre-se para ver o conteúdo escondido

Recomendado

Por favor Login ou se não possuir um conta Registre-se para ver o conteúdo escondido

Isto por si, já reduz consideravelmente o tempo do script.

 

 

Outra coisa, usando a estrutura descrita por vc:

Arquivo de uma pasta que vira array

 

kf2k2mp.zip

 

Objetivo. Procurar o nome da array no arquivo de texto e com o stringBetween obter o nome verdadeiro do arquivo para criar uma array 2D

Exemplo:

 

---Linhas contida nos arquivos--

game ( name kf2k2mp description "The King of Fighters 2002 Magic Plus (bootleg)" )

game ( name kf2k2mp2 description "The King of Fighters 2002 Magic Plus II (bootleg)" )

...

----------------------------------------

---Nova array 2D

Col 0              |  Col 1

kf2k2mp.zip    | The King of Fighters 2002 Magic Plus (bootleg)

kf2k2mp2.zip  | The King of Fighters 2002 Magic Plus II (bootleg)

 

 

Lembramos de um ponto interessante que vc mencionou antes: Que ao pesquisar no Bloco de Notas, é quase instantâneo mas pelo script demora muito!

 

Mas da maneira que vc fez deu a entender que o arquivo Arcade.Lst será aberto e fechado a cada elemento do array, gerando sobrecarga e lentidão, resultando no tempo muito grande e demorado para processar todos os arquivos (2o gargalo).

 

Simplesmente abrindo o arquivo antes do loop principal, carregando seu conteúdo numa variável de memória e fazendo a pesquisa a partir daí vai melhorar muito

 

Finalmente vc usa um loop secundário para recuperar o nome da ROM para poder inserir na 2a coluna do seu array original (3o gargalo).

 

Recomendo utilizar melhor o StringRexExp que é possível fazer tudo numa operação só, assim:

Por favor Login ou se não possuir um conta Registre-se para ver o conteúdo escondido

Testa aí. Veja se melhorou o tempo de processamento.

Nada melhor que um arquivo de 20k linhas para tirar a dúvida  :lol:

 

Lembrando que raramente fazemos algoritmos tão bons que fazem diferença em termos de tempo de processamento, mas pequenos ganhos em etapas individuais podem trazer um ganho enorme no final das contas!

 



#15 Pedro Pinheiro

Pedro Pinheiro

    Membro Nível 1

  • Membros
  • PipPip
  • 185 posts
  • LocationBrazil

Postado 04 maio 2017 - 11:28

Rapaz. com o stringInStr demorou quase 3 minutos. O programa em C++ que usa esse arquivo abre e verifica ele quase que instantâneo (3 segundos). Tem algo no c++ que ajuda nesse processo? Uma coisa que eu reparei que o IniRead é instantâneo (8 segundos para verificar 600 arquivos), mesmo eu colocando um IniRead em cada volta do loop, o processo é bem rápido.

Editado por Pedro Pinheiro, 05 maio 2017 - 04:06 .


#16 Manimal

Manimal

    Membro Nível 3

  • Administradores (Adm)
  • PipPipPipPip
  • 321 posts
  • LocationVideira/SC

Postado 05 maio 2017 - 08:32

Olá Pedro.

 

Os 3 minutos é bom ou ruim? Em relação ao tempo anterior, não ao programa em C++

 

Lógico que programas compilados (C++) sempre serão mais rápidos que os interpretados (AutoIt), mas a diferença não deveria ser tão grande!

 

O IniRead é instantâneo (ou quase) porque a informação é recuperada diretamente (Seção / Chave), não há necessidade de pesquisa.

 

Pode não parecer mas o StringRegExp (ou mesmo o StringInStr) são funções muito demoradas pois envolvem muita complexidade. Até acho que internamente o StringInStr faz uso da StringRegExp, o que torna as duas praticamente a mesma coisa.

 

Mas vc está dizendo que em vez do arquivo com 20k linhas, vc teria 600 arquivos INI (um para cada arquivo da lista) com o nome completo da ROM gravado nele?

 

Finalmente neste caso, não valeria a pena renomear os arquivos incluindo o nome completo da ROM? Porque daí demorava apenas uma vez e não haveria necessidade de completar a informação! Isto é, se o MAME permite isso...



#17 joelson0007

joelson0007

    Administrador

  • Administradores (Adm)
  • PipPipPipPipPip
  • 895 posts
  • LocationGuarapuava - PR

Postado 05 maio 2017 - 08:54

Tem algo no c++ que ajuda nesse processo?

 

Como o maninal falou, programa compilado é mais rapido.

 

Linguagens como autoit tem o GIL, o famoso  Global interpreter lock

Por favor Login ou se não possuir um conta Registre-se para ver o conteúdo escondido

 

Mas o autoit foi concebido para automatização onde velocidade de processo, etc, não é um problema, você pode intercalar, as funções mais complicadas com outra linguagem se for o caso.



#18 Pedro Pinheiro

Pedro Pinheiro

    Membro Nível 1

  • Membros
  • PipPip
  • 185 posts
  • LocationBrazil

Postado 05 maio 2017 - 09:28

nao @Manimal. Eu peguei o arquivo e modifiquei ele para ser lido como ini. cada volta no loop ele vai e faz um iniread. eu fiquei pensando se ler um arquivo ini muitas vezes assim nao gera uma sobrecarga. É possivel recriar o iniread como uma udf? nao achei nos arquivos do autoit nada sobre


ex:
[lista]
kof01=The king of fighters 2001

Editado por Pedro Pinheiro, 05 maio 2017 - 09:37 .


#19 Manimal

Manimal

    Membro Nível 3

  • Administradores (Adm)
  • PipPipPipPip
  • 321 posts
  • LocationVideira/SC

Postado 05 maio 2017 - 01:50

Olá Pedro.

 

Entendi agora seu uso dos INI.

 

Teoricamente sobre se haveria uma possível sobrecarga ao ler o INI repetidas vezes, a resposta é não!

 

Se este procedimento deixa o teu programa rápido como vc quer (ou precisa), vai nessa!  :600866:

 

Toda e qualquer função pode ser desenvolvida (ou redesenhada) do zero para satisfazer suas necessidades específicas. As funções que temos hoje, são apenas os blocos básicos com os quais desenvolvemos melhor nossas lógicas.

 

Claro que seria um saco ter que desenvolver uma rotina como StringRight ou FileOpen ou qualquer outra. Mas o princípio é de que TUDO pode ser recriado como função!

 

Se vc não gosta de uma função, recrie-a como vc gosta. Não gosta dos argumentos? Escreva outra com os argumentos que vc precisa!

 

Um belo exemplo seria a função MSgBox Plus que está aqui no fórum.

 

Por consequência, reescrever a INIREAD seria totalmente possível!

 

Na verdade, se vc pegar uma linguagem e montar um subsistema que facilite pra outras pessoas programarem, vc simplesmente estará criando um Framework. Dependendo do seu sucesso neste Framework, ele será mais conhecido (ou utiizado) do que a linguagem original  ;)







Tópicos que também usam as tags contar palavras, contar, palavras, txt, texto:

1 usuário(s) está(ão) lendo este tópico

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

Documentação OnLine de referência