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

vb6 encontrar e remover strings

Discussão em 'Programação' iniciada por droidman, 7 de Abril de 2008. (Respostas: 21; Visualizações: 5396)

  1. droidman

    droidman Power Member

    não consigo encontrar uma função verifique o campo depois de uma letra.
    por exemplo, tenho uma base de dados enorme de mails, e quero remover todos os mais @hotmail.com
    todos os campos depois de @ e que sejam "hotmail.com" sao removidos. os dados sao carregados para uma listbox.
     
  2. balute

    balute Power Member

    Isto vai ser útil:
    Código:
    InStr(<string A>, <string B>) 'se a string B existe na A, devolve a posição do primeiro caracter da string B na string A; senão, devolve 0.
    E, já agora:
    Código:
    Left(<string>, X) 'devolve os primeiros X caracteres da string.
     
  3. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    O que lhe interessa não é só o Left, como também o que está após. Assim, há mais uma função a acrescentar:

    Código:
    Mid(<string>, X, [Y]) 'devolve os primeiros Y caracteres existentes a partir da posição X.
    'Caso Y seja omitido, são retornados todos os caracteres até ao final da string:
    '  ou seja, Y = Len(string) - X
    
     
  4. spastikman

    spastikman Banido



    que tal fazeres a query directa a base de dados para excluir esses dominios (algo como NOT LIKE '[email protected]')
     
  5. droidman

    droidman Power Member

    funciona bem vou tentar implementar isto no que quero, basta um ou dois ifs, algo tipo
    if funçao que me deste = true then remover da linha da listbox

    spastikman a ideia é o programa ser para um colega meu e para mim etc. nao é para complicar mto, isto é para listas de mailing medianas, no maximo ate 50.000 mails. e é para as separar e aliviar um bocado. nao é para grandes andanças até porque as listboxes de vb6 sao mto limitadas em termos de memoria. e se fizesse queries em SQL manualmente... o meu colega tava sempre dependente de mim

    obrigado a todos
     
  6. jpaulino

    jpaulino Power Member

    Mas se queres remover da base de dados o melhor é fazer uma update query
     
  7. droidman

    droidman Power Member

    quero remover de ficheiros em TXT nao me devo ter explicado bem. as bases de dados sao intocaveis, sao opt in e opt out, é td automatico, o k kero fazer é mesmo localmente, contabilizar dominios individuais, separar hotmails de gmails e yahoos etc. o servidor basicamente fica intacto.
     
  8. jpaulino

    jpaulino Power Member

    Ok, então o código que coloquei serve.
     
  9. droidman

    droidman Power Member

    jpaulino nao tou a pegar bem nisto
    supondo que tenho um textbox com o domínio "@hotmail.com"
    e que na list1 estao os mails, pretendo apagar da list1 todos os mails do text1.text
    e com o teu codigo nao consigo utilizar um if InStr = X para depois fazer list1.removeitem (i) caso ele seja @hotmail.com
    tou a dar um no cego aposto que é algo simples... :confused:
     
  10. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    droidman,
    Código:
    For i = 1 To list1.listcount
      If instr(ucase(List1.List(i)), ucase(text1.text)) Then
        List1.RemoveItem i
      End If
    Next i
    
     
  11. jpaulino

    jpaulino Power Member

    Deves fazer algo semelhante ao que o angelofwisdom colocou só que, quando se apagam itens, deves começar de baixo para cima.

    Informa-nos de como está.
     
  12. droidman

    droidman Power Member

    obrigadão
    um pequeno reparo no código
    for i= 1 tem que ser for i=0 porque as listboxes tem algo primitivo que arranca num valor nulo nao sei la mto bem porque, tou para perceber esta.
    desculpa a demora a responder mas entretanto apareceu aqui trabalho (trabalho a sério) e teve que ser feito ;)

    ah e meti-lhe um contador pequenito para dizer ktos mails foram removidos de cada vez e um botao de guardar e ta feito, so lhe faltam alguns testes e validações e o programa está a 100% :D
    obrigadão
    caso alguem depois queira o soure (que é basico mas pronto) é so pedir
     
  13. droidman

    droidman Power Member

    realmente os computadores existem para resolver problemas que antes deles não existiam :)
    deparei-me com um erro interessante que me fez dar aqui voltas, o resume next nao funciona e o GOTO faz com que saia do ciclo, a ver se algum expert me ilucida.
    no
    Código:
    InStr(UCase(List1.List(i)), UCase(Text1.Text))
    por vezes CASO o mail seja inválido ou tenha algum carater marado, ele da overflow.
    por exemplo, algum esperto subscreveu a nossa mailing list com um carater tipo Í ou ÷ ã etc, e para saltar para a linha seguinte e ignorar essa, não vejo como o faça.
     
  14. Armadillo

    Armadillo Folding Member

    se eu percebi bem, isto deve bastar (depois tens que prever todas as situações para caracteres acentuados no "if" (ou nao acentuados, fica ao teu critério)
    Código:
    For i = 1 To list1.listcount
      if instr(ucase(list1.list(i), "ã")=0 or (etc etc)then
        If instr(ucase(List1.List(i)), ucase(text1.text)) Then
          List1.RemoveItem i
        End If
      end if
    Next i
    
     
  15. droidman

    droidman Power Member

    não ha uma forma de por os caraters validos em vez dos milhares de possiveis invalidos?
    algo do genero de "a" a "z" de "A" a "Z" e "." e "_" e "-" e "@" axo k é isso. mas n tou a ver la mto bem fazer um CASE de mais de 80 linhas ::rolleyes:
     
  16. Armadillo

    Armadillo Folding Member

    pois...
    mas podes adicionar uma referencia ao teu projecto para poderes ter regex no vb6 (edit2:sem teres que definir todos os caracteres).
    Vê aqui nestes links:
    http://support.microsoft.com/kb/818802
    http://msdn2.microsoft.com/en-us/library/1400241x.aspx
    http://msdn2.microsoft.com/en-us/library/6wzad2b2.aspx

    deve bastar :p

    cumps

    edit:
    o que tens depois a fazer é uma funcao que te retorne True/False, conforme o endereco de email seja válido, e fazer essa verificaçao no if que eu acrescentei ao codigo ja existente ;)
     
    Última edição: 8 de Abril de 2008
  17. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    Armadillo, muito bom, mesmo! Não tinha conhecimento da possibilidade de usar RegExps em VB. Isto ter-me-ia dado jeito tantas, e tantas vezes!

    droidman, só uma modificação na linha do FOR para reflectir o que o jpaulino sugeriu (e muito bem!), e a tua correcção. Sim, começa a partir do zero, mas como eu estava com alguma pressa e escrevi o código à mão sem sequer testar, esqueci-me completamente desse pormenor:

    Código:
    For i = List1.ListCount [B]- 1[/B] To [B]0[/B] Step -1
    Assim ele começa do fim (começando do início, se houvessem 2 @hotmail.com seguidos, só o primeiro é que era removido), e o último item não é o List1.Listcount - é o anterior (para ListCount = 10, existe item 0, 1, 2, 3, 4, 5, 6, 7, 8 e 9).

    Foram duas falhas que se me escaparam naquele momento.

    Em relação ao teu segundo problema, o que o Armadillo disse deve resolver. É preferível usar regexps, mas podes sempre usar uma função como esta:
    Código:
    Private Function ValidarMail(mail As String) As Boolean
     
        ValidarMail = True
     
        For i = 1 To Len(mail)
            cc = Mid(mail, i, 1)
            acc = Asc(cc)
     
            If Not ((acc >= Asc("A") And acc <= Asc("Z")) Or _
                    (acc >= Asc("a") And acc <= Asc("z")) Or _
                    (acc >= Asc("0") And acc <= Asc("9")) Or _
                     cc = "." Or cc = "_" Or cc = "@") Then
     
               ValidarMail = False
     
            End If
     
        Next i
     
    End Function
    
    mas para além de poder ser bastante optimizada (fi-la à pressa), esta função aceita mails como asgf23t34tgv4g443g...[email protected], e acho que não queremos isso :P

    As regexps fazem isto tudo, muito mais e requerem muito menos código. Aconselho :)

    edit - num outro tópico encontrei um site que por acaso tem uma função que até promete:

    PHP:
    /*
       Check if a string is in valid email format. 
    */
    function isEmail(str)
    {
    var 
    regex = /^[-_.a-z0-9]+@(([-a-z0-9]+\.)+(ad|ae|aero|af|ag|
    ai|al|am|an|ao|aq|ar|arpa|as|at|au|aw|az|ba|bb|bd|be|bf|bg|bh|
    bi|biz|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|
    ck|cl|cm|cn|co|com|coop|cr|cs|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|
    ec|edu|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gh|
    gi|gl|gm|gn|gov|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|
    il|in|info|int|io|iq|ir|is|it|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|
    kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|mg|mh|mil|mk|
    ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|museum|mv|mw|mx|my|mz|na|name|nc|
    ne|net|nf|ng|ni|nl|no|np|nr|nt|nu|nz|om|org|pa|pe|pf|pg|ph|pk|
    pl|pm|pn|pr|pro|ps|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|
    si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tm|
    tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|
    vu|wf|ws|ye|yt|yu|za|zm|zw)|(([0-9][0-9]?|[0-1][0-9][0-9]|[2]
    [
    0-4][0-9]|[2][5][0-5])\.){3}([0-9][0-9]?|[0-1][0-9][0-9]|[2]
    [
    0-4][0-9]|[2][5][0-5]))$/i;
    return 
    regex.test(str);
    }
    Fonte: http://www.php-mysql-tutorial.com/mysql-php-guestbook.php

    Isto é PHP, mas dado que o que interessa é a regexp, é facilmente "convertível" em VB :)
     
    Última edição: 8 de Abril de 2008
  18. droidman

    droidman Power Member

    obrigado o programa agora esta bem melhor ja nao da erros :)
     

Partilhar esta Página