Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: leliCabello en 26 Junio 2010, 01:41 am



Título: codigo para sacar de un conjunto de texto números
Publicado por: leliCabello en 26 Junio 2010, 01:41 am
hayforma de que en un texto combinado con numeros, saque de ahi solo los numero....ayuden


Título: Re: codigo para sacar de un conjunto de texto números
Publicado por: rob1104 en 26 Junio 2010, 04:15 am
Si, si hay forma.

Saludos


Título: Re: codigo para sacar de un conjunto de texto números
Publicado por: raul338 en 26 Junio 2010, 05:49 am
Si, si hay forma.

:xD :xD :xD

Si! con expresiones regulares!!!!

Código:
(\d+)

Esa es la expresion regular para obtener todos los numeros de un texto
Ahora investiga como usar las expresiones regulares y como obtener los grupos generados por las ER (expresiones regulares) desde vb ;)


Título: Re: codigo para sacar de un conjunto de texto números
Publicado por: Anco en 26 Junio 2010, 05:53 am
No manejo vb, aunque te dare otra idea mas no el codigo, primero calculas cuantos caracteres tiene la cadena, haces un ciclo con el dato anterior parar recorrer la cadena, comparas cada caracter, y aquellos que sean numeros los guardas en una variable. Seguro el vb debe tener alguna funcion para hacerte la vida aun mas facil, asi que BUSCA.  :)


Título: Re: codigo para sacar de un conjunto de texto números
Publicado por: Shell Root en 26 Junio 2010, 06:20 am
Es mejor y más fácil con expresiones regulares :P. Pero no tengo VB en mi laptop :S

Código
  1. Function dejarNumeros(cadenaTexto As String) As String
  2.  Const listaNumeros = "0123456789"
  3.  Dim cadenaTemporal As String
  4.  Dim i As Integer
  5.  
  6.  cadenaTexto = Trim$(cadenaTexto)
  7.  If Len(cadenaTexto) = 0 Then
  8.    Exit Function
  9.  End If
  10.  
  11.  cadenaTemporal = ""
  12.  
  13.  For i = 1 To Len(cadenaTexto)
  14.    If InStr(listaNumeros, Mid$(cadenaTexto, i, 1)) Then
  15.      cadenaTemporal = cadenaTemporal + Mid$(cadenaTexto, i, 1)
  16.    End If
  17.  Next
  18.  return cadenaTemporal
  19. End Function
Fuente: :http://ftp.ajpdsoft.com/modules.php?name=Content&pa=showpage&pid=228


Título: Re: codigo para sacar de un conjunto de texto números
Publicado por: Karcrack en 26 Junio 2010, 13:40 pm
Me aburria :-[
Código
  1. Private Sub Form_Load()
  2.    Debug.Print SoloNumeros("P1rueba922")
  3. End Sub
  4.  
  5. Public Function SoloNumeros(ByVal sCadena As String) As String
  6.    Dim vItem       As Variant
  7.    Dim bvBytes()   As Byte
  8.  
  9.    bvBytes = StrConv(sCadena, vbFromUnicode)
  10.  
  11.    For Each vItem In bvBytes
  12.        If (48 <= vItem) And (vItem <= 57) Then
  13.            SoloNumeros = SoloNumeros & Chr$(vItem)
  14.        End If
  15.    Next vItem
  16. End Function


Título: Re: codigo para sacar de un conjunto de texto números
Publicado por: Psyke1 en 28 Junio 2010, 10:53 am
Aqui dejo mi alternativa:
Código
  1. Option Explicit
  2.  
  3. Private Sub Form_Load()
  4.    Debug.Print Only_Numbers("hola1 ¿que34 tal538?")
  5. End Sub
  6.  
  7. Public Function Only_Numbers(ByVal sText As String) As String
  8.    Dim sActualChar     As String * 1
  9.    Dim lTotalChar      As Long
  10.    Dim x               As Long
  11.    lTotalChar = Len(sText)
  12.    If lTotalChar > 0 Then
  13.        For x = 1 To lTotalChar
  14.            sActualChar = Mid$(sText, x, 1)
  15.            If IsNumeric(sActualChar) Then Only_Numbers = Only_Numbers & sActualChar
  16.        Next
  17.    End If
  18. End Function

Salu2! ;)


Título: Re: codigo para sacar de un conjunto de texto números
Publicado por: BlackZeroX en 28 Junio 2010, 11:08 am
Ando desvelándome y esto ya lo había hecho pero... no me dio la gana resolverle la vida en el momento asi qué con un lindo retardo pongo esto:

Es mas lento qué los anteriores aquí expuestos pero esta pensado para:


 * Obtener números Negativos (Con signo).
 * Obtener números con Decimales!¡ (Optativo Coma decimal o punto Decimal según se especifique!¡.).


 * No esta Optimizado el codigo!¡.
 * No esta terminado aun!¡.
 * Bug de que si se espesifica un signo valido (Ejemplo coma decimal) tomara en sucesion esta sentencia "6546.65163.565" o equivalente a la misma!¡.


Código
  1. '
  2. ' ////////////////////////////////////////////////////////////////
  3. ' // Autor: BlackZeroX ( Ortega Avila Miguel Angel )            //
  4. ' //                                                            //
  5. ' // Web: http://InfrAngeluX.Sytes.Net/                         //
  6. ' //                                                            //
  7. ' // |-> Pueden Distribuir Este Código siempre y cuando         //
  8. ' // no se eliminen los créditos originales de este código      //
  9. ' // No importando que sea modificado/editado o engrandecido    //
  10. ' // o achicado, si es en base a este código                    //
  11. ' ////////////////////////////////////////////////////////////////
  12. '
  13. Option Explicit
  14.  
  15. Public Function GetArrayNumbersFromString(ByVal StrInput$, Optional ByVal SepDecimal$ = ".") As String()
  16. Dim StrArray_TMPArrayNumers$()
  17. Dim Lng_Pos&
  18. Dim Lng_LenMid&
  19. Dim Lng_PosIInArray&
  20. Dim Lng_LenStr&
  21. Dim Str_Tmp$
  22. Dim Str_Char$
  23.    Lng_LenStr& = Strings.Len(StrInput$)
  24.    If Lng_LenStr& > 1 Then
  25.        If Not Information.IsNumeric(StrInput$) Then
  26.            Str_Char$ = Strings.Space$(1)
  27.            For Lng_Pos& = 1 To Lng_LenStr&
  28.                Str_Char$ = Strings.Mid$(StrInput$, Lng_Pos&, 1)
  29.                If IsNumeric(Str_Char$) Or (Lng_LenMid& And Str_Char$ = SepDecimal$) Or (Lng_LenMid& = 0 And Str_Char$ = "-") Then
  30.                    Lng_LenMid& = Lng_LenMid& + 1
  31.                ElseIf Lng_LenMid& > 0 And Lng_Pos& <= Lng_LenStr& - 1 Then
  32.                    If Lng_LenMid& = 1 And Strings.Mid$(StrInput$, Lng_Pos& - Lng_LenMid&, Lng_LenMid&) = "-" Then
  33.                        Lng_LenMid& = 0
  34.                    Else
  35.                        ReDim Preserve StrArray_TMPArrayNumers$(Lng_PosIInArray&)
  36.                        StrArray_TMPArrayNumers$(Lng_PosIInArray&) = Strings.Mid$(StrInput$, Lng_Pos& - Lng_LenMid&, Lng_LenMid&)
  37.                        Lng_PosIInArray& = Lng_PosIInArray& + 1
  38.                        Lng_LenMid& = 0
  39.                    End If
  40.                End If
  41.            Next
  42.            If Lng_LenMid& > 0 Then
  43.                    ReDim Preserve StrArray_TMPArrayNumers$(Lng_PosIInArray&)
  44.                    StrArray_TMPArrayNumers$(Lng_PosIInArray&) = Strings.Mid$(StrInput$, Lng_Pos& - Lng_LenMid&, Lng_LenStr&)
  45.            End If
  46.        Else
  47.            ReDim StrArray_TMPArrayNumers$(Lng_PosIInArray&)
  48.            StrArray_TMPArrayNumers$(Lng_PosIInArray&) = StrInput$
  49.        End If
  50.    End If
  51.    GetArrayNumbersFromString = StrArray_TMPArrayNumers$()
  52. End Function
  53.  
  54.  

Código
  1.  
  2.    Const Str_Cadena$ = "123.4567.89.miguel angel000ort.....ega avila-a159.753jjj"
  3.    MsgBox Strings.Join(GetArrayNumbersFromString(Str_Cadena$, ""), "-") & Constants.vbNewLine & _
  4.           Strings.Join(GetArrayNumbersFromString(Str_Cadena$, "."), "-")
  5.  
  6.  

Sangriento Infierno Lunar!¡.


Título: Re: codigo para sacar de un conjunto de texto números
Publicado por: Psyke1 en 28 Junio 2010, 22:01 pm
Buena Black!  :)
Pero tengo una duda:
Citar
* Bug de que si se espesifica un signo valido (Ejemplo coma decimal) tomara en sucesion esta sentencia "6546.65163.565" o equivalente a la misma!¡.
No entiendo, si detecta "6546.65163.565" que quieres hacer exactamente???  :huh:
Entonces si en la cadena hay una direeccion Ip, estaria bien cojerla, ¿no?  :silbar:

PD: En 2 dias subo una alternativa al code de BlackZer0X! :P

Salu2!  ;)


Título: Re: codigo para sacar de un conjunto de texto números
Publicado por: BlackZeroX en 28 Junio 2010, 23:26 pm

un numero valido no puede ni deve tener dos puntos decimales validos!¡.

Sangriento Infierno Lunar!¡.


Título: Re: codigo para sacar de un conjunto de texto números
Publicado por: Psyke1 en 29 Junio 2010, 11:25 am
Si si, eso quedo claro, pero...
Entonces que quieres hacer si tienes la cadena: "6546.65163.565"? :huh:
No lo guardarias en el array??

Salu2! :P


Título: Re: codigo para sacar de un conjunto de texto números
Publicado por: Karcrack en 29 Junio 2010, 12:26 pm
He hecho esta bonita funcion mientras me aburria :P

Código
  1. Public Function ExtractNumbers(ByVal sString As String, Optional bReturnAsString As Boolean = False) As Collection
  2.    Dim cTemp   As New Collection
  3.    Dim sTemp   As String
  4.    Dim sChar   As String * 1
  5.    Dim i       As Long
  6.  
  7.    sString = Replace$(sString, ",", ".")
  8.  
  9.    For i = 1 To Len(sString)
  10.        sChar = Mid$(sString, i, 1)
  11.        Do While (sChar Like "#") Or (sChar = ".")
  12.            sTemp = sTemp & sChar
  13.            i = i + 1
  14.            sChar = Mid$(sString, i, 1)
  15.        Loop
  16.        If Val(sTemp) Then
  17.            cTemp.Add IIf((bReturnAsString = False), Val(sTemp), sTemp)
  18.        End If
  19.        sTemp = vbNullString
  20.    Next i
  21.  
  22.    Set ExtractNumbers = cTemp
  23. End Function

Ejemplo:
Código:
Private Sub Form_Load()
    Dim vItem   As Variant
    
    For Each vItem In ExtractNumbers("Estoy provando la extracción de números como 1992, también la extracción de números decimales: 3,1415 o 3.1415")
        Debug.Print vItem
    Next vItem
End Sub


Título: Re: codigo para sacar de un conjunto de texto números
Publicado por: raul338 en 29 Junio 2010, 16:37 pm
Código
  1.  
  2. Public Function GetNumeros(text As String) As Collection
  3.    ' Incluir en las referencias: Microsoft VBScritp Regular Expressions 5.5
  4.    ' Obtener numeros, mediante expresiones regulares. By Raul338
  5.    On Error GoTo err
  6.    Dim cTemp As New Collection
  7.    Dim objRegExp As RegExp
  8.    Dim objMatch As Match
  9.    Dim objMatches
  10.  
  11.    Set objRegExp = New RegExp
  12.    Dim patron As String
  13.  
  14.    'patron = "(\d+)"                            ' Numeros enteros
  15.    'patron = "(\d+(?:[\.,]\d+)?)"                ' Numeros con/sin decimales
  16.    patron = "(\d{1,3}(\.\d{3})+(?:,\d+)?|\d+(?:,\d+)?)"   ' Numeros con separador de miles (.) con/sin decimales (,)
  17.    'patron = "(\d{1,3}(\,\d{3})+(?:\.\d+)?|\d+(?:\.\d+)?)"   ' Numeros con separador de miles (,) con/sin decimales (.)
  18.    'patron = "(\d+[,.]\d+)"                        ' Numeros con decimales
  19.  
  20.    objRegExp.Pattern = patron
  21.    objRegExp.Global = True
  22.  
  23.    Set objMatches = objRegExp.Execute(text)
  24.  
  25.    For Each objMatch In objMatches
  26.        cTemp.Add objMatch.Value
  27.     Next
  28.    Set GetNumeros = cTemp
  29.    Exit Function
  30. err:
  31.    ' Aca tira error en caso de que metan mal la mano en las expresiones regulares xD
  32. End Function
  33.  

Código
  1. Private Sub Form_Load()
  2.    Dim item As Variant
  3.    Dim s As String
  4.    s = "Estoy provando la extracción de números como 1992, también la extracción de números decimales: 3,1415"
  5.    s = s & "Tambien puedo decir que tengo 1000000,24 dolares o 1.123.456,78 euros (?)"
  6.    For Each item In GetNumeros(s)
  7.        Debug.Print item
  8.    Next
  9. End Sub
  10.  

Aver quien supera eso (?) :xD


Título: Re: codigo para sacar de un conjunto de texto números
Publicado por: BlackZeroX en 29 Junio 2010, 16:55 pm

... la cosa era usar un algoritmo ¬¬" no Expresiones R. tramposo ¬¬". jajaja.

bueno para evitar la referencia usar

Código
  1.  
  2.    Dim cTemp       As New Collection
  3.    Dim objRegExp   As Object 'RegExp
  4.    Dim objMatch    As Object 'Match
  5.    Dim objMatches  As Object
  6.    Dim patron      As String
  7.  
  8.    Set objRegExp = CreateObject("VBScript.RegExp") 'New RegExp
  9.  
  10.  

Dulce Infierno Lunar!¡.


Título: Re: codigo para sacar de un conjunto de texto números
Publicado por: Psyke1 en 29 Junio 2010, 21:24 pm
@Karcrack
Citar
Me aburria :-[
Citar
He hecho esta bonita funcion mientras me aburria :P
AJAJAJA :xD
Te aburres mucho tu, ¿¿eh??  :P
... la cosa era usar un algoritmo ¬¬" no Expresiones R. tramposo ¬¬". jajaja.
JAJAJJAJA :laugh:
Raul y sus Expr.Reg... :silbar:

Bueno aqui os dejo la funcion que prometi, que ademas capta los numeros negativos :P:
Código
  1. Option Explicit
  2.  
  3. Public Function Get_Only_Numbers(ByVal sText As String) As String()
  4.    Const sDecimals             As String = ",.'"
  5.    Dim sNumbersArray()         As String
  6.    Dim sActualChar             As String * 1
  7.    Dim sNextChar               As String * 1
  8.    Dim sPreviousChar           As String * 1
  9.    Dim bAcceptString           As Boolean
  10.    Dim lTotalChar              As Long
  11.    Dim x                       As Long
  12.    Dim y                       As Long
  13.  
  14.    lTotalChar = Len(sText)
  15.    If lTotalChar > 0 Then
  16.        ReDim sNumbersArray(0)
  17.        For x = 1 To lTotalChar
  18.            If x > 1 Then sPreviousChar = Mid$(sText, x - 1, 1)
  19.            sActualChar = Mid$(sText, x, 1): sNextChar = Mid$(sText, x + 1, 1)
  20.            If ((sActualChar = Chr$(45) Or InStr(sDecimals, sActualChar) > 0 And IsNumeric(sPreviousChar)) _
  21.            And IsNumeric(sNextChar)) Or (IsNumeric(sActualChar)) Then
  22.                bAcceptString = True
  23.            Else
  24.                If bAcceptString = True Then y = y + 1: ReDim Preserve sNumbersArray(y): bAcceptString = False
  25.            End If
  26.            If bAcceptString = True Then sNumbersArray(y) = sNumbersArray(y) & sActualChar
  27.        Next x
  28.        Get_Only_Numbers = sNumbersArray()
  29.        Erase sNumbersArray
  30.    End If
  31. End Function
  32.  
  33. Private Sub Form_Load()
  34.    Dim vItem                 As Variant
  35.    Dim sStringToAnalyze      As String
  36.  
  37.    sStringToAnalyze = "Estoy provando la extracción de números como 1992, también la extracción de números decimales: 3,1415 o 3.1415"
  38.    sStringToAnalyze = sStringToAnalyze & "También puedo decir que tengo 1000000,24 dólares o 1.123.456,78 euros (?)"
  39.    sStringToAnalyze = sStringToAnalyze & "Pero mi función también reconoce numeros como el -2344 y 5'567 y no los confunde con m.456 ni con -a89 ... =)"
  40.    For Each vItem In Get_Only_Numbers(sStringToAnalyze): Debug.Print vItem: Next
  41. End Sub

Obtengo esto:
Citar
3,1415
3.1415
1000000,24
1.123.456,78
-2344
5'567
456
89

Salu2! ;)


Título: Re: codigo para sacar de un conjunto de texto números
Publicado por: raul338 en 30 Junio 2010, 00:36 am

... la cosa era usar un algoritmo ¬¬" no Expresiones R. tramposo ¬¬". jajaja.

Yo dije primero que se puede con expreg. Ustedes fueron los tipos con tiempo libre para dedicarle al tema, yo la hice facil y corta xD

He hecho esta bonita funcion mientras me aburria :P

No funciona con los ultimos 2 numeros q puse :P


Título: Re: codigo para sacar de un conjunto de texto números
Publicado por: Psyke1 en 30 Junio 2010, 14:57 pm

... la cosa era usar un algoritmo ¬¬" no Expresiones R. tramposo ¬¬". jajaja.

Yo dije primero que se puede con expreg. Ustedes fueron los tipos con tiempo libre para dedicarle al tema, yo la hice facil y corta xD

He hecho esta bonita funcion mientras me aburria :P

No funciona con los ultimos 2 numeros q puse :P

JOJOJOJO :laugh:
No, si al final acabamos a tortas!! :laugh:

Salu2! ;)


Título: Re: codigo para sacar de un conjunto de texto números
Publicado por: Karcrack en 1 Julio 2010, 12:15 pm
Buen codigo Psyke, pero seria mas sencillo si trabajaras con Collections ;)


Título: Re: codigo para sacar de un conjunto de texto números
Publicado por: Psyke1 en 1 Julio 2010, 13:18 pm
Gracias Karcrack! ;D
Lo tendre en cuenta para futuras ocasiones! ;)

Salu2!


Título: Re: codigo para sacar de un conjunto de texto números
Publicado por: Psyke1 en 27 Julio 2010, 00:24 am
Buff, espero que no me llameis pesado  :laugh:, pero esta es mi RegExp para hacer EXACTAMENTE lo que hace la funcion que postee:
Citar
((\-)?\d+(([\.,']\d+)+)?)
Claro que no incluye validacion como la que hizo Raul...  :-\
Predon por revivir post... :-* ;)

DoEvents¡! :P