1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

VB6 - Encontrar string (com nitro)

Discussão em 'Programação' iniciada por droidman, 20 de Setembro de 2008. (Respostas: 5; Visualizações: 1785)

  1. droidman

    droidman Power Member

    Tenho ficheiros enormes de texto no meu pc, por vezes preciso de saber se num determinado directório ha um ficheiro em TXT com uma determinada string, então andei à procura duma forma de procurar strings muito rápidamente, e encontrei 2 formas aqui:
    www.vbforums.com/showthread.php?p=2316263

    no fim da página tem um link directo para outro source code com uma melhoria:
    Código:
    http://www.vbforums.com/attachment.php?attachmentid=66617&d=1221847756
    Até aqui tudo bem, ele procura e tal, diz que é muito rápido, e é, mas não consigo fazer output disto. Ele está a converter a string para binário ou coisa parecida para a encontrar de uma forma rápida, e eu carrego o texto que quero procurar de uma listbox com um FOR de 1 a list2.listcount com as strings que quero, se ele encontrar, só tem que dizer algo tipo
    Código:
    text2.text = list1.list(conta) & vbnewline
    que é o contador da posição da string em que ele vai. Nem estou a fazer isto procurar todos os txt's num directório, só queria mesmo saber o que tenho que adicionar ao código, ou alterar, para que ele caso encontre a string me diga alguma coisa nesse momento para por a resposta numa textbox

    thanks in advance
     
  2. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    No cmdAPI_Click (attach do primeiro link), onde diz
    Código:
    ApiReadFile "file.txt", "abc"
    muda para
    Código:
        For i = 0 To List2.ListCount - 1
            ApiReadFile "file.txt", List2.List(i)
        Next i
    
    e acrescenta um Dim i As Integer antes.

    Na função ApiReadFile, troca
    Código:
    Label1.Caption = Mid(ApiReadFile, InStrRev(ApiReadFile, vbNewLine, InStr(1, ApiReadFile, strStringToFind)), (InStr(InStr(1, ApiReadFile, strStringToFind), ApiReadFile, vbNewLine)) - InStrRev(ApiReadFile, vbNewLine, InStr(1, ApiReadFile, strStringToFind)))
    por
    Código:
    List1.Additem Mid(ApiReadFile, InStrRev(ApiReadFile, vbNewLine, InStr(1, ApiReadFile, strStringToFind)), (InStr(InStr(1, ApiReadFile, strStringToFind), ApiReadFile, vbNewLine)) - InStrRev(ApiReadFile, vbNewLine, InStr(1, ApiReadFile, strStringToFind)))
    Se bem percebi, queres que ele itere os items da List2 e pesquise por cada um. Eu é que pus a List1 como "mostrar resultados". Agora é contigo para mudares isso :P
    A partir daqui já deves conseguir qualquer coisa ;)
     
  3. droidman

    droidman Power Member

    meti
    Código:
    Text2.Text = Text2.Text & Mid(ApiReadFile, InStrRev(ApiReadFile, vbNewLine, InStr(1, ApiReadFile, strStringToFind)), (InStr(InStr(1, ApiReadFile, strStringToFind), ApiReadFile, vbNewLine)) - InStrRev(ApiReadFile, vbNewLine, InStr(1, ApiReadFile, strStringToFind)))
    e mesmo assim o text2.text fica em branco
    eu ja tinha feito grande parte do que tinhas dito mas nao fiz o list2.listcount -1 porque meti um contador a contar as linhas kdo carrega os dados, caso passe das 64.000 o vb passa a negativo e flipa-se das ideias, e desta forma isso nao acontece
     
  4. ups

    ups Power Member

    Questão: a pesquisa do windows é assim tao lenta para ti?
     
  5. droidman

    droidman Power Member

    sim, procurar um e-mail num ficheiro com 8gb duma base de dados pode levar algum tempo ao windows.(o e-mail serve como ID por ser unico para o que estou a fazer. nem toda a gente mete o telemóvel etc e por nome nunca mais la ia.) Alias, eu devia era fazer isto em python mas quero fazer com uma linguagem que sei + - porque em py ou pl sou mesmo iniciado ja fiz uma vez em perl um que apagava repetidos num ficheiro e era 500x mais rapido que qualquer versao em vb que eu faça.
    outra coisa, embora a ideia aqui expressa seja procurar uma string num ficheiro, o meu programa não faz bem isso, o meu programa procurará strings num directório em mais do que um ficheiro. por exemplo, 300 e-mails em 5 ficheiros de diferentes tamanhos, uns com quase 10gb outros com bem menos. Isto é para recuperar informações em ficheiros e bases de dados teoricamente danificadas e foi-me pedido por um amigo meu que não sabe programar daí eu estar a fazer em VB6 que é a linguagem que melhor conheço. Este programa depois vai permitir qualquer pessoa, meter o que quer encontrar numa listbox carregada dum TXT (1 item por linha) e vai procurar numa pasta em tudo que seja .txt ou .sql etc. pode procurar de 1 item em 900 ficheiros a 50 items em 900 ficheiros. Para mim vai ser tremendamente útil :) e fazer isto no windows com copy-paste demorava ainda mais.
     
  6. droidman

    droidman Power Member

    resolvi o problema com um ciclo for e carregando cada linha do ficheiro para uma variavel em vez de o abrir. é rapido se o ficheiro tiver muitas linhas porque utiliza o instr para verificar dentro da string a existencia do texto.
    fiz testes, um ficheiro com cerca de 100mb é verificado no meu pc em + - 6 segundos, e um ficheiro de 8mb com todo o texto numa so linha demora mais de 20 segundos. agora tou a tentar fazer a parte em que ele abre tudo que seja .txt num directório. se alguem precisar do codigo é só dizer
     

Partilhar esta Página