• Viernes 8 de Noviembre de 2024, 00:47

Autor Tema:  Podrian Publicar funciones para procesar Cadena de texto  (Leído 8393 veces)

Jimbenit

  • Miembro MUY activo
  • ***
  • Mensajes: 269
  • Nacionalidad: co
    • Ver Perfil
    • http://ingenieriacivil.foroactivo.com
Podrian Publicar funciones para procesar Cadena de texto
« en: Viernes 12 de Septiembre de 2008, 20:45 »
0
Aveces es necesario procesar cadenas de texto, sé que muchos de ustedes se han encontrado con que tienen que diseñar funciones o sub-procedimientos para poder procesar cadenas de texto de una manera muy especial.

Pues este post lo hice con la intencion para que publiquen sus funciones (esas que ustedes han diseñado) que trabajen con cadenas de TEXTO.
Empiezo yo.

En cierta ocasion tuve que diseñar una funcion que me pasara una cadena de texto en sus equivalentes ASCII, pero con un formato especial, por ejemplo:
"Hola mundo"
El resultado debia ser:


10,72,111,108,97,32,109,117,110,100,111


Donde el primer numero indica el numero de caracteres de la cadena y los demas numeros son sus equivalentes ASCII

La funcion es la siguiente:


Código: Text
  1. Function CadenaASCII(CadenaNormal As String) As String
  2. 'Esta funcion recibe una cadena y como resultado da
  3. 'El numero de caracteres con los caracteres pasados a sus valores
  4. 'de la tabla ASCII
  5. 'EJEMPLO:
  6. 'CadenaASCII("YAIR")
  7. 'da como resultado
  8. '4,89,65,73,82
  9. 'Donde el primer numero (4), es el numero de caracteres
  10. 'Y los siguientes numeros son las letras en sus valores ASCII
  11.  
  12. Dim NumLet As Long
  13. Dim LetrASCII As String
  14. Dim Cadena As String
  15. Cadena = CadenaNormal
  16. Cadena = Trim(Cadena)
  17. NumLet = Len(Cadena)
  18.  
  19. For i = 1 To NumLet
  20.     LetrASCII = Asc(Mid(Cadena, i, 1))
  21.    
  22.     If NumLet = 1 Then
  23.         CadenaASCII = LetrASCII
  24.     ElseIf i = 1 Then
  25.         CadenaASCII = LetrASCII & ","
  26.     ElseIf i = NumLet Then
  27.         CadenaASCII = CadenaASCII & LetrASCII
  28.     Else
  29.         CadenaASCII = CadenaASCII & LetrASCII & ","
  30.     End If
  31. Next i
  32.  
  33. CadenaASCII = NumLet & "," & CadenaASCII
  34.  
  35. End Function
  36.  


Copienla en un modulo y pruebenla en la ventana inmediato y luego me cuentan que les parece,
Publiquen las suyas!!

saludos.




Yo quiero mucho a Toph ---> Mi Web]http://ingenieriacivil.foroactivo.com[/url]

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #1 en: Lunes 15 de Septiembre de 2008, 05:01 »
0
Esa misma función  puede optimizarse ... y no precisa señalar cuantos caracteres tiene.
el trim no deberías hacerlo ya que si la idea es convertir una cadena de texto a una equivalente numérica estarías eliminado información, si resultara necesario hacerlo entonces debe especificarse claramente 'quitar espacios a ambos lados y convertirla a....' pero entonces el nombre de la función habría que cambiarla ya que así se prestaría a confusión.

Por ejemplo:
Código: Visual Basic
  1.  
  2. Function CadenaASCII(CadenaNormal As String) As String
  3.      dim k as long, cadena as string
  4.    
  5.      on local error goto errorSobrepasa:
  6.      if cadenanormal="" then exit function
  7.      if len(cadenanormal)=1 then
  8.          CadenaASCII= asc(cadenanormal)
  9.         exit function
  10.      else
  11.           if len(cadenanormal)>16383 then
  12.                msgbox "Existen posibilidades de que se produzca un error..."
  13.           end if
  14.      end if
  15.          for k=1 to len(cadenanormal)-1  ' el último carácter lo quedamos fuera del bucle
  16.            cadenanormal=cadenanormal & asc(mid$(cadenanormal,k,1)) & ","
  17.          next ' al finalizar el bucle, k todavía aumenta en 1
  18.          cadenanormal=cadenanormal & asc(mid$(cadenanormal,k,1)) ' tras el último carácter no añadimos la coma
  19.  
  20.         CadenaASCII=cadenanormal
  21.         exit function
  22. errorSobrepasa:
  23.      msgbox "Cada carácter de entrada genera entre 2 y 4 caracteres de salida. en VB6 el tamaño máximo de una cadena son 65535 caracteres, dicho valor se ha alcanzado con el " & k " ésimo carácter de la cadena de entrada..." & vbcrlf & err.description
  24.      CadenaASCII=cadenanormal
  25. end sub
  26.  
  27.  
Simplemente quitamos las comprobaciones , enlentecen el trabajo y solo va a entrar en las comprobaciones 1 vez cuando es el primer carácter, pero se comprueba con cada carácter, en todo caso ese carácter hacerlo antes del bucle y para el último carácter lo mismo, sólo entrará en el último ciclo del bucle por tanto acortamos el ciclo en una unidad y al final añadimos el último carácter, pero ahorrándonos , las comprobaciones con cada carácter.

Por cierto tu función dará error cuando le pases una cadena de cierto tamaño... lee los msgbox que he puesto en el código.
En otro momento te pongo una función de esas que pides...
«Ma non troppo»
----> ModoVacaciones = False<----

F_Tanori

  • Moderador
  • ******
  • Mensajes: 1919
  • Nacionalidad: mx
    • Ver Perfil
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #2 en: Lunes 15 de Septiembre de 2008, 06:15 »
0
A ver prueba esta a ver si te funciona

Código: Visual Basic
  1. Function ConvertAscii(ByRef as_Cadena As String) As String
  2. On Error GoTo xError
  3.     Dim i As Integer, AsciiCode() As Byte
  4.     AsciiCode = as_Cadena
  5.     For i = LBound(AsciiCode) To UBound(AsciiCode) Step 2
  6.         ConvertAscii = ConvertAscii & Format(AsciiCode(i), ",00")
  7.     Next i
  8.     ConvertAscii = (i / 2) & ConvertAscii
  9.  
  10. xError:
  11.     If Err.Number > 0 Then
  12.         ConvertAscii = Err.Description
  13.         Err.Clear
  14.     End If
  15. End Function
  16.  
  17.  

Saludos
" ExIsTo y A vEcEs PiEnSo "

NOTA:
===========================================================================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
===========================================================================================================================

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #3 en: Lunes 15 de Septiembre de 2008, 10:37 »
0
Estilo programación funcional:

Código: Visual Basic
  1.  
  2. Function ConvertAscii(ByRef as_Cadena As String) As String
  3.      If as_Cadena = vbNullString Then
  4.           ConvertAscii = vbNullString
  5.      Else
  6.           ConvertAscii = CStr(AscB(Left(as_Cadena,1))) & ConvertAscii(Right(as_Cadena,Len(as_Cadena) - 1))
  7.      End If
  8. End Function
  9.  
  10.  

No la he probado, así que es sólo teórico  ^_^

Jimbenit

  • Miembro MUY activo
  • ***
  • Mensajes: 269
  • Nacionalidad: co
    • Ver Perfil
    • http://ingenieriacivil.foroactivo.com
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #4 en: Lunes 15 de Septiembre de 2008, 16:12 »
0
Moskito. Revisa el siguiente codigo, no esta bien.

Código: Text
  1. Function ConvertAscii(ByRef as_Cadena As String) As String
  2.       If as_Cadena = vbNullString Then
  3.            ConvertAscii = vbNullString
  4.       Else
  5.            ConvertAscii = CStr(AscB(Left(as_Cadena,1))) & ConvertAscii(Right(as_Cadena,Len(as_Cadena) - 1))
  6.       End If
  7.  End Function
  8.  


Yo quiero mucho a Toph ---> Mi Web]http://ingenieriacivil.foroactivo.com[/url]

Jimbenit

  • Miembro MUY activo
  • ***
  • Mensajes: 269
  • Nacionalidad: co
    • Ver Perfil
    • http://ingenieriacivil.foroactivo.com
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #5 en: Lunes 15 de Septiembre de 2008, 16:14 »
0
La funcion inversa de esta...

Código: Text
  1. Function CadenaNormal(CadenaASCII As String) As String
  2. 'Convierte una cadena de formato ASCII en formato normal legible
  3. 'EJEMPLO:
  4. 'considere la cadena "4,89,65,73,82"
  5. 'esta función devuelve "YAIR"
  6.  
  7.  
  8. Dim NroCaracteres As Long       'Cuenta el numero de caracteres de la cadena ASCII
  9. Dim Letr As String
  10. Dim NumLet As Long
  11. Dim PosComas() As Long
  12. Dim NrsASCII() As String
  13. Dim Cont As Long
  14. Dim ComaDemas As Long   'Si existe una comas demas, esta variable almacena suposicion para su posterior reemplazo
  15.  
  16. CadenaASCII = Trim(CadenaASCII)
  17. NroCaracteres = Len(CadenaASCII)
  18.  
  19. For i = 1 To NroCaracteres          'Obtiene el numero de letras de la cadena normal
  20.     Letr = Mid(CadenaASCII, i, 1)
  21.     If Asc(Letr) = 44 Then
  22.         NumLet = Val(Left(CadenaASCII, i - 1))
  23.         Exit For
  24.     End If
  25. Next i
  26.  
  27. ReDim PosComas(NumLet)
  28. Cont = 0
  29. For i = 1 To NroCaracteres          'Obtiene la posicion de las comas y las introduce en el vetor POSCOMAS
  30.     Letr = Mid(CadenaASCII, i, 1)
  31.     If Asc(Letr) = 44 Then
  32.         Cont = Cont + 1
  33.         If Cont > NumLet Then       'Si hay comas demas que no hacen parte de la palabra, sera eliminada
  34.             ComaDemas = InStr(PosComas(Cont - 1) + 1, CadenaASCII, ",")
  35.             CadenaASCII = Mid(CadenaASCII, 1, ComaDemas - 1)
  36.             Exit For
  37.         End If
  38.         PosComas(Cont) = i
  39.     End If
  40. Next i
  41.  
  42. 'Si se introduce un cero, se devuelve vacio ("")
  43. If NumLet = 0 Then CadenaNormal = ""
  44. 'If NumLet = 0 Then Exit Sub
  45. ReDim NrsASCII(NumLet)
  46.  
  47. If NumLet = 1 Then      'Introduce los numeros ASCII en el vector NrsASCII
  48.     NrsASCII(NumLet) = Mid(CadenaASCII, PosComas(NumLet) + 1)
  49. Else
  50.     For i = 1 To NumLet
  51.         If i = NumLet Then
  52.             NrsASCII(i) = Str(Val(Mid(CadenaASCII, PosComas(i) + 1)))
  53.         Else
  54.             NrsASCII(i) = Mid(CadenaASCII, PosComas(i) + 1, PosComas(i + 1) - PosComas(i) - 1)
  55.         End If
  56.     Next i
  57. End If
  58.  
  59. For i = 1 To NumLet
  60.     CadenaNormal = CadenaNormal & Chr(Val(NrsASCII(i)))
  61. Next i
  62.            
  63. End Function
  64.  
  65.  


Yo quiero mucho a Toph ---> Mi Web]http://ingenieriacivil.foroactivo.com[/url]

Jimbenit

  • Miembro MUY activo
  • ***
  • Mensajes: 269
  • Nacionalidad: co
    • Ver Perfil
    • http://ingenieriacivil.foroactivo.com
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #6 en: Lunes 15 de Septiembre de 2008, 16:42 »
0
Mokito, saludos desde Colombia, me gustaria que revisaras el codigo antes de envialo.  :good:

Cita de: "m0skit0"
Estilo programación funcional:
No la he probado, así que es sólo teórico  ^_^


F_Tanori, es excelente tu función.

Citar
Function ConvertAscii(ByRef as_Cadena As String) As String
On Error GoTo xError
    Dim i As Integer, AsciiCode() As Byte
    AsciiCode = as_Cadena
    For i = LBound(AsciiCode) To UBound(AsciiCode) Step 2
        ConvertAscii = ConvertAscii & Format(AsciiCode(i), ",00")
    Next i
    ConvertAscii = (i / 2) & ConvertAscii
 
xError:
    If Err.Number > 0 Then
        ConvertAscii = Err.Description
        Err.Clear
    End If
End Function




Citar
errorSobrepasa:
     msgbox "Cada carácter de entrada genera entre 2 y 4 caracteres de salida. en VB6 el tamaño máximo de una cadena son 65535 caracteres, dicho valor se ha alcanzado con el " & k " ésimo carácter de la cadena de entrada..." & vbcrlf & err.description
      CadenaASCII=cadenanormal

Nebire, si asi es... tienes razón, pero para cadenas cortas esta buena, no??


Yo quiero mucho a Toph ---> Mi Web]http://ingenieriacivil.foroactivo.com[/url]

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #7 en: Lunes 15 de Septiembre de 2008, 17:18 »
0
Cita de: "Nilson Yair"
Revisa el siguiente codigo, no esta bien.

Sip, cierto, había un 5 de más debido a vbNullString.

Código: Visual Basic
  1.  
  2. Function ConvertAscii(ByRef as_Cadena As String) As String
  3.  
  4.     If as_Cadena = vbNullString Then
  5.         ConvertAscii = ""
  6.     Else
  7.         ConvertAscii = CStr(AscB(Left(as_Cadena, 1))) & "," & ConvertAscii(Right(as_Cadena, Len(as_Cadena) - 1))
  8.     End If
  9.  
  10. End Function
  11.  
  12.  

Sí, tiene una coma de más al final  :P

Cita de: "Nilson Yair"
F_Tanori, es excelente tu función.

Tienes un juicio discutible...

En cuanto a tu función inversa es demasiado código para algo tan sencillo.

La inversa de la mía (donde la cadena lleva una coma al final):

Código: Visual Basic
  1.  
  2. Function ConvertString(ByRef str_Cadena As String) As String
  3.  
  4.     If str_Cadena = vbNullString Then
  5.         ConvertString = ""
  6.     Else
  7.         ConvertString = Chr(CInt(Left(str_Cadena, InStr(1, str_Cadena, ",") - 1))) & ConvertString(Right(str_Cadena, Len(str_Cadena) - InStr(1, str_Cadena, ",")))
  8.     End If
  9.  
  10. End Function
  11.  
  12.  

El problema de la coma es fácilmente solucionable fuera de las funciones, así que no lo considero un error. Saludos.

Jimbenit

  • Miembro MUY activo
  • ***
  • Mensajes: 269
  • Nacionalidad: co
    • Ver Perfil
    • http://ingenieriacivil.foroactivo.com
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #8 en: Lunes 15 de Septiembre de 2008, 17:27 »
0
Citar
Sí, tiene una coma de más al final :P
Tienes un juicio discutible...


Bueno, mi funcion para pasar a ascii posee una coma demas al final cuando el resultado es un solo numero

Por ejemplo:
'En la ventana inmediato prueba esto:
Código: Text
  1. PRINT convertascii(""),,, cadenaascii("")
  2.  

La funcio de la izq. es la de F_tenori, y la mia es la de la derecha.

¿Ves la diferencia de la coma?, pero para propositos practicos, esta buena... (hey, me agradas, VEO QUE ESTAS MUY CONECTADO!!!,  B) )


Yo quiero mucho a Toph ---> Mi Web]http://ingenieriacivil.foroactivo.com[/url]

Jimbenit

  • Miembro MUY activo
  • ***
  • Mensajes: 269
  • Nacionalidad: co
    • Ver Perfil
    • http://ingenieriacivil.foroactivo.com
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #9 en: Lunes 15 de Septiembre de 2008, 17:37 »
0
Citar
En cuanto a tu función inversa es demasiado código para algo tan sencillo.

La inversa de la mía (donde la cadena lleva una coma al final):

Mostrar/Ocultar Número de línea | Expandir/Contraer | Seleccionar todo

   1.  
   2. Function ConvertString(ByRef str_Cadena As String) As String
   3.  
   4.     If str_Cadena = vbNullString Then
   5.         ConvertString = ""
   6.     Else
   7.         ConvertString = Chr(CInt(Left(str_Cadena, InStr(1, str_Cadena, ",") - 1))) & ConvertString(Right(str_Cadena, Len(str_Cadena) - InStr(1, str_Cadena, ",")))
   8.     End If
   9.  
  10. End Function
  11.  


Estas como que diciendo incoherencias...
Mira esta funcion que pusiste "La inversa", esta mala... ¿Otraves enviando funciones sin probarlas?.... &lt;_&lt;

copia este codigo en la ventana inmediato y prueba esto (con tu funcion inversa)
Código: Text
  1. PRINT convertstring("4,89,65,73,82")
  2.  
  3.  
El resultado deberia ser "YAIR" pero esto da un error, ¿¿estas practicando programacion funcional?? (cambia de manual)

Moskito, saludos amigo...  :good:


Yo quiero mucho a Toph ---> Mi Web]http://ingenieriacivil.foroactivo.com[/url]

Jimbenit

  • Miembro MUY activo
  • ***
  • Mensajes: 269
  • Nacionalidad: co
    • Ver Perfil
    • http://ingenieriacivil.foroactivo.com
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #10 en: Lunes 15 de Septiembre de 2008, 21:32 »
0
Citar
MOSKITO DICE:
Tienes un juicio discutible...
En cuanto a tu función inversa es demasiado código para algo tan sencillo.

Bueno mira, la coma del final en tu funcion esta como requisito indispensable, acuerdate que es la funcion inversa de la primera, la cual no tiene coma al final (excepto cuando el valor resultado es un solo numero, como en el caso de : "")
¿Acaso se te hace dificil quitar esta coma del final dentro de esta misma función?, eso es por tu amor por a la recursividad, cierto ?  &lt;_&lt;

y sobre lo de "demasiado codigo" (puede que sea cierto y tengas razón)


Me quede esperando las funciones de ustedes, me gustaria revisarlas  &lt;_&lt;


Yo quiero mucho a Toph ---> Mi Web]http://ingenieriacivil.foroactivo.com[/url]

Jimbenit

  • Miembro MUY activo
  • ***
  • Mensajes: 269
  • Nacionalidad: co
    • Ver Perfil
    • http://ingenieriacivil.foroactivo.com
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #11 en: Lunes 15 de Septiembre de 2008, 21:41 »
0
Citar
MOSKITO DICE:
El problema de la coma es fácilmente solucionable fuera de las funciones, así que no lo considero un error

Bien, y que me dices del primer caracter generado por tu funcion...?

Código: Text
  1. print  convertstring("4,89,65,73,82,")
  2. YAIR
  3.  
  4.  


Yo quiero mucho a Toph ---> Mi Web]http://ingenieriacivil.foroactivo.com[/url]

Jimbenit

  • Miembro MUY activo
  • ***
  • Mensajes: 269
  • Nacionalidad: co
    • Ver Perfil
    • http://ingenieriacivil.foroactivo.com
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #12 en: Lunes 15 de Septiembre de 2008, 21:53 »
0
Ya se , ya se, ya se que he puesto muchos post referentes a este tema, solo espero que los moderadores me tengan algo de paciencia.

[LA PRUEBA DE FUEGO]

Recuerdan cuando uno estaba pequeño, aprendiendo la división?, cuando los profesores mandaban a uno a probar la división de dos cifras, el resultado (el cociente) se multiplicaba por el divisor y se le sumaba el residuo, este resultado debia ser el dividendo... recuerdan?

Pues bien, probemos las funciones de cadena para pasar a ascii y la funcion inversa



Código: Text
  1. Print CadenaNormal(CadenaASCII("YAIR"))
  2.  
[/color]


El resultado es "YAIR", si no da este resultado las funciones ( o una de las dos)estan malas.... ok?...

saludos.




 :good: Dificil???

Pues si... lo hacemos un poquito mas agradable.


Yo quiero mucho a Toph ---> Mi Web]http://ingenieriacivil.foroactivo.com[/url]

F_Tanori

  • Moderador
  • ******
  • Mensajes: 1919
  • Nacionalidad: mx
    • Ver Perfil
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #13 en: Lunes 15 de Septiembre de 2008, 22:07 »
0
Cita de: "Nilson Yair"
Citar
MOSKITO DICE:
El problema de la coma es fácilmente solucionable fuera de las funciones, así que no lo considero un error

Bien, y que me dices del primer caracter generado por tu funcion...?

Código: Text
  1. print  convertstring("4,89,65,73,82,")
  2. YAIR
  3.  
  4.  

Es por el numero 4 que tienes a iniciar la cadena ya que moskito no concidera el numero de caracteres de la cadena :P igual ocurrira un error sin una coma al final lo cual a mi si me parece un error :P

Incluso hay variacion de resultados (Nebire lo coloque al ultimo porque al parecer modifica la cadena y nos afecta al usarla byRef)

Código: Visual Basic
  1. Function Test(ByRef Text As String)
  2.     Debug.Print "Yair = " & Space(10) & CadenaASCII(Text)
  3.     Debug.Print "F_Tanori = " & Space(6) & ConvertAscii(Text)
  4.     Debug.Print "Moskito = " & Space(10) & ConvertAscii_Moskito(Text)
  5.     Debug.Print "Nebire = " & Space(8) & CadenaASCII_Nebire(Text)
  6. End Function
  7.  

Saludos
" ExIsTo y A vEcEs PiEnSo "

NOTA:
===========================================================================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
===========================================================================================================================

F_Tanori

  • Moderador
  • ******
  • Mensajes: 1919
  • Nacionalidad: mx
    • Ver Perfil
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #14 en: Lunes 15 de Septiembre de 2008, 22:22 »
0
Esta es mi solucion inversa

Código: Visual Basic
  1. Function ConvertString_FTanori(ByRef as_Cadena As String) As String
  2. On Error GoTo xError
  3.     Dim i As Integer, AsciiCode
  4.    
  5.     AsciiCode = Split(as_Cadena, ",")
  6.    
  7.     For i = LBound(AsciiCode) + 1 To UBound(AsciiCode)
  8.         If AsciiCode(i) <> Empty Then
  9.             ConvertString_FTanori = ConvertString_FTanori & Format(Chr(AsciiCode(i)), " ")
  10.         End If
  11.     Next i
  12.  
  13. xError:
  14.     If Err.Number > 0 Then
  15.         ConvertString_FTanori = Err.Description
  16.         Err.Clear
  17.     End If
  18. End Function
  19.  

Asume que lleva la longitud al inicio de la cadena

Debug
Código: Text
  1. ?ConvertString_FTanori("4,89,65,73,82")
  2.  

Saludos
« última modificación: Lunes 15 de Septiembre de 2008, 23:20 por F_Tanori »
" ExIsTo y A vEcEs PiEnSo "

NOTA:
===========================================================================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
===========================================================================================================================

Jimbenit

  • Miembro MUY activo
  • ***
  • Mensajes: 269
  • Nacionalidad: co
    • Ver Perfil
    • http://ingenieriacivil.foroactivo.com
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #15 en: Lunes 15 de Septiembre de 2008, 22:34 »
0
Moskito no se donde tiene la cabeza, su funcion tiene un error es el siguiente ejemplo:


Código: Text
  1. print convertstring("1")
  2.  


Parece que no acostumbra a verificar su funcion antes de postearla
Mi función tiene un error cuando el numero de caracteres sobrepasa cierto limite, como anoto Nebire
Citar
if len(cadenanormal)>16383 then
                msgbox "Existen posibilidades de que se produzca un error..."
          end if


Nuevamente, F_Tanori... muy bien por la función inversa.
 B)  :good:


Yo quiero mucho a Toph ---> Mi Web]http://ingenieriacivil.foroactivo.com[/url]

Jimbenit

  • Miembro MUY activo
  • ***
  • Mensajes: 269
  • Nacionalidad: co
    • Ver Perfil
    • http://ingenieriacivil.foroactivo.com
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #16 en: Lunes 15 de Septiembre de 2008, 22:44 »
0
Cuando digo:
Citar
Nuevamente, F_Tanori... muy bien por la función inversa.
No quiero decir que la de F_Tanori sea perfecta, de hecho no lo es...



miremos el siguiente codigo... comparemos.

Código: Text
  1. print ConvertString_FTanori("4,89,65,73,82,15,65"),,cadenanormal("4,89,65,73,82,15,65")
  2. YAIRA                      YAIR
  3.  
  4.  

A la izquierda la de Tanori;  a la derecha, la mia
¿Que paso?, parece que la de Tanori no usa el primer numero (4) como parametro de cantidad de lectura de la función

Ahora si ven por que no es perfecta?


Yo quiero mucho a Toph ---> Mi Web]http://ingenieriacivil.foroactivo.com[/url]

Jimbenit

  • Miembro MUY activo
  • ***
  • Mensajes: 269
  • Nacionalidad: co
    • Ver Perfil
    • http://ingenieriacivil.foroactivo.com
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #17 en: Lunes 15 de Septiembre de 2008, 22:49 »
0
Error Tanori

Miremos el sigueinte codigo:

Código: Text
  1. For i = LBound(AsciiCode) + 1 To UBound(AsciiCode)      'El limite superior no es el primer numero de la cadena?, o acaso es el numero de comas??
  2.  


Yo quiero mucho a Toph ---> Mi Web]http://ingenieriacivil.foroactivo.com[/url]

F_Tanori

  • Moderador
  • ******
  • Mensajes: 1919
  • Nacionalidad: mx
    • Ver Perfil
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #18 en: Lunes 15 de Septiembre de 2008, 23:02 »
0
Cita de: "Nilson Yair"
Cuando digo:
Citar
Nuevamente, F_Tanori... muy bien por la función inversa.
No quiero decir que la de F_Tanori sea perfecta, de hecho no lo es...



miremos el siguiente codigo... comparemos.

Código: Text
  1. print ConvertString_FTanori("4,89,65,73,82,15,65"),,cadenanormal("4,89,65,73,82,15,65")
  2. YAIRA                      YAIR
  3.  
  4.  

A la izquierda la de Tanori;  a la derecha, la mia
¿Que paso?, parece que la de Tanori no usa el primer numero (4) como parametro de cantidad de lectura de la función

Ahora si ven por que no es perfecta?

Por supuesto que ninguna  programacion es perfecta, ahora en mensajes anteriores quedo claro que
"4,89,65,73,82" daba como resultado YAIR (esta cadena incluye la longitud de la cadena en texto) y en el ejemplo de este mensaje estas colocando otra palabra

"4,89,65,73,82,15,65"
 
Aqui da como resultado YAIR
ConvertString_FTanori("4,89,65,73,82")

Aqui da como resultado YAIRA
ConvertString_FTanori("4,89,65,73,82,15,65") ' Ya que hay 2 caracteres de mas y el 15 "es el cuadrito" 65 es "A" que se ve al final

Arreglo (0) = 4
Arreglo (1) = 89
Arreglo (2) = 65
Arreglo (3) = 73
Arreglo (4) = 82
Arreglo (5) = 15
Arreglo (6) = 65

Estariamos hablando de una cadena de longitud 6 por lo tanto la posicion cero que es la longitud de la cadena miente porque dice 4

Tu funcion daria el mismo resultado de esta manera

cadenanormal("6,89,65,73,82,15,65")
YAIRA

Saludos
" ExIsTo y A vEcEs PiEnSo "

NOTA:
===========================================================================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
===========================================================================================================================

F_Tanori

  • Moderador
  • ******
  • Mensajes: 1919
  • Nacionalidad: mx
    • Ver Perfil
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #19 en: Lunes 15 de Septiembre de 2008, 23:08 »
0
Cita de: "Nilson Yair"
Error Tanori

Miremos el sigueinte codigo:

Código: Text
  1. For i = LBound(AsciiCode) + 1 To UBound(AsciiCode)      'El limite superior no es el primer numero de la cadena?, o acaso es el numero de comas??
  2.  


Código: Text
  1. LBound(AsciiCode)
  2.  
Dara como resultado 0 que es la posicion que guarda la longitud de la cadena

Código: Visual Basic
  1. LBound(AsciiCode)  + 1
  2.  

Solo la posicion 0 y despues convierte los caracteres de la cadena pasada como parametro, pero si hay que generar solo la longitud que viene en la cadena  aqui esta el SP 1 :P

Código: Text
  1. Function ConvertString_FTanori(ByRef as_Cadena As String) As String
  2. On Error GoTo xError
  3.     Dim i As Integer, AsciiCode
  4.    
  5.     AsciiCode = Split(as_Cadena, ",")
  6.    
  7.     For i = LBound(AsciiCode) + 1 To AsciiCode(0)
  8.         If AsciiCode(i) <> Empty Then
  9.             ConvertString_FTanori = ConvertString_FTanori & Format(Chr(AsciiCode(i)), " ")
  10.         End If
  11.     Next i
  12.  
  13. xError:
  14.     If Err.Number > 0 Then
  15.         ConvertString_FTanori = Err.Description
  16.         Err.Clear
  17.     End If
  18. End Function
  19.  
  20.  

Saludos
« última modificación: Lunes 15 de Septiembre de 2008, 23:19 por F_Tanori »
" ExIsTo y A vEcEs PiEnSo "

NOTA:
===========================================================================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
===========================================================================================================================

Jimbenit

  • Miembro MUY activo
  • ***
  • Mensajes: 269
  • Nacionalidad: co
    • Ver Perfil
    • http://ingenieriacivil.foroactivo.com
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #20 en: Lunes 15 de Septiembre de 2008, 23:12 »
0
Al principio de este post dije:
Citar
En cierta ocasion tuve que diseñar una funcion que me pasara una cadena de texto en sus equivalentes ASCII, pero con un formato especial, por ejemplo:
"Hola mundo"
El resultado debia ser:


10,72,111,108,97,32,109,117,110,100,111


Donde el primer numero indica el numero de caracteres de la cadena y los demas numeros son sus equivalentes ASCII

Cierto???
Pues bien, el numero de caracteres leidos esta especificado por el primer numero que aparece en la cadena, por que si no es asi entonces
¿De que serviría estar en la cadena?

Con lo anterior quiero decir que no importa cuantos numeros aparezcan en esta cadena, solo seran leidos la cantidad de caracteres que se especifiquen en el primer numero de la cadena.


 B) Pero... me impresiona mucho la capacidad de este codigo... en serio....

Muy bien.... muy bien hecho... de verdad..


Yo quiero mucho a Toph ---> Mi Web]http://ingenieriacivil.foroactivo.com[/url]

Jimbenit

  • Miembro MUY activo
  • ***
  • Mensajes: 269
  • Nacionalidad: co
    • Ver Perfil
    • http://ingenieriacivil.foroactivo.com
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #21 en: Lunes 15 de Septiembre de 2008, 23:17 »
0
B) Excelente Tanori... excelente :good:

 :lol: Fue divertido, no???


Yo quiero mucho a Toph ---> Mi Web]http://ingenieriacivil.foroactivo.com[/url]

Jimbenit

  • Miembro MUY activo
  • ***
  • Mensajes: 269
  • Nacionalidad: co
    • Ver Perfil
    • http://ingenieriacivil.foroactivo.com
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #22 en: Lunes 15 de Septiembre de 2008, 23:56 »
0
[INICIANDO NUEVA FUNCION]

Ya que ninguno publica sus funciones de procesamientos de texto, el cual es el objetivo principal de este post, yo publicaré otra de mis funciones de procesamiento de texto

En cierta ocasión una vez tuve que diseñar un codigo que me permitiera guardar datos en un bloc de notas pero con un formato muy especial , este formato es el siguiente:

El bloc de notas debia ser organizado por filas y columnas, y guardar los datos de acuerdo a esta posición.
Ejemplo:
Código: Text
  1. Call EscribirDatoMATRIZ(3, 10, "Cadena guardada en (F= 10, C=3)", "C:BlocMio.txt")
  2.  
Lo anterior guarda "Cadena guardada en (F= 10, C=3)" en la posicion : fila 10 , columna 3 del orden que se invento en esta función[/color], las comas separan las COLUMNAS y las filas del bloc de notas separan las FILAS de este formato


Si quisiera guardar el numero 20, de acuerdo al orden aqui descrito en la posicion Fila = 4, Columna = 3: el codigo seria el siguiente:


Código: Text
  1. Call EscribirDatoMATRIZ(3, 4, 20, "C:BlocMio.txt")
  2.  
"C:BlocMio.txt" es la ruta donde este archivo se guarda.
[/color]


El proceso es el siguiente:
Código: Text
  1. Sub EscribirDatoMATRIZ(Colum As Long, Fila As Long, Dato As Variant, RutaArchivo As String)
  2. 'Guarda datos en un bloc notas en forma de comas... utiliza el bloc
  3. 'como una matriz ordenada por filas y columnas... [Mayo 5 / 2008]
  4.  
  5. Dim Contador As Double
  6. Dim Vector() As Variant
  7. Dim Caracter As String
  8. Dim Max As Double
  9. Dim Linea As Long
  10. Dim Cadena As String
  11. Dim NumLet As Long
  12. Dim Letr As String
  13. Dim Cont As Long
  14. Dim PosComas() As Long
  15. Dim Pedazo1 As String
  16. Dim Pedazo2 As String
  17. Dim Comas_Add As Long
  18.  
  19. If Dir(RutaArchivo) = "" Then           'Comprueba si existe archivo, en caso de no existir, lo crea.
  20.     Open RutaArchivo For Output As #1
  21.     Print #1, " "
  22.     Close #1
  23. End If
  24.  
  25. Linea = Fila
  26.  
  27. For j = 1 To 2          'Introduce todas las lineas del Bloc notas en un Vector llamado Vector()
  28.     Open RutaArchivo For Input As #1
  29.     While Not EOF(1)                'Cuenta las lineas del Bloc Notas
  30.         Line Input #1, Caracter
  31.         i = i + 1
  32.         If j = 1 Then
  33.             Contador = i
  34.         ElseIf j = 2 Then       'Si j = 2 , se escriben las lineas dentro del vector
  35.             Vector(i) = Caracter
  36.         End If
  37.     Wend
  38.     Close #1
  39.     If j = 1 Then
  40.         If Linea > Contador Then        'Define el tamaño del vector
  41.             ReDim Vector(1 To Linea)
  42.             Max = Linea
  43.         Else
  44.             ReDim Vector(1 To Contador)
  45.             Max = Contador
  46.         End If
  47.         i = 0
  48.     End If
  49. Next j
  50.  
  51.  
  52. For i = 1 To Max        'Obtiene la fila en string separada por comas
  53.     If i = Fila Then
  54.         Cadena = Vector(i)
  55.     End If
  56. Next i
  57.  
  58.             'Obtención de las posiciones de las comas
  59. '@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  60.         NumLet = Len(Cadena)
  61.         For i = 1 To NumLet     'Cuenta las comas dentro de la cadena
  62.             Letr = Mid(Cadena, i, 1)
  63.             If Asc(Letr) = 44 Then
  64.                 Cont = Cont + 1
  65.             End If
  66.         Next i
  67.  
  68.         If Colum > Cont + 1 Then        'Columna vacia
  69.             Comas_Add = Colum - (Cont + 1)
  70.             For i = 1 To Comas_Add
  71.                 Cadena = Cadena & ", "
  72.             Next i
  73.             Cont = Colum - 1
  74.         End If
  75.        
  76.         NumLet = Len(Cadena)
  77.         ReDim PosComas(Cont)
  78.         Cont = 0
  79.         For i = 1 To NumLet     'Coloca las posiciones de las comas dentro del vector
  80.             Letr = Mid(Cadena, i, 1)
  81.             If Asc(Letr) = 44 Then
  82.                 Cont = Cont + 1
  83.                 PosComas(Cont) = i
  84.             End If
  85.         Next i
  86. '@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  87.  
  88. 'Añadiendo el dato a la cadena [Elimina el dato anterior en esa posición]
  89. If Cont = 0 Then
  90.     Cadena = Dato
  91. ElseIf Colum = 1 Then                           'Coloca el dato al principio
  92.     Cadena = Dato & Mid(Cadena, PosComas(1))
  93. ElseIf Colum = UBound(PosComas()) + 1 Then      'Coloca el dato al final
  94.     Cadena = Mid(Cadena, 1, PosComas(Colum - 1)) & Dato
  95. Else
  96.     Pedazo1 = Mid(Cadena, 1, PosComas(Colum - 1))
  97.     Pedazo2 = Mid(Cadena, PosComas(Colum))
  98.     Cadena = Pedazo1 & Dato & Pedazo2
  99. End If
  100.  
  101. 'Escribiendo en el Bloc Notas
  102. Open RutaArchivo For Output As #1
  103. For i = 1 To Max
  104.     If i = Linea Then
  105.         Vector(i) = Cadena
  106.         Print #1, Vector(i)
  107.     Else
  108.         Print #1, Vector(i)
  109.     End If
  110. Next i
  111. Close #1
  112.  
  113.  
  114.  
  115. End Sub
  116.  
  117.  


Yo quiero mucho a Toph ---> Mi Web]http://ingenieriacivil.foroactivo.com[/url]

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #23 en: Martes 16 de Septiembre de 2008, 08:55 »
0
Interesante discusión, chavales. Aunque os falta un poco de experiencia en programación  ^_^ (es broma, no se piquen)

¿Para qué quieres poner la longitud al principio? Me parece una perdida de tiempo, aunque acepto que sea el enunciado. De todas formas, se puede quitar antes de llamar a la función.

Ay, Nilson, a ver si leemos

Cita de: "Nilson Yair"
Moskito no se donde tiene la cabeza, su funcion tiene un error es el siguiente ejemplo:


Mostrar/Ocultar Número de línea | Expandir/Contraer | Seleccionar todo

   1. print convertstring("1")

Cita de: "m0skit0"
La inversa de la mía (donde la cadena lleva una coma al final):

En cuanto a F_tanori...

Cita de: "F_Tanori"
ocurrira un error sin una coma al final lo cual a mi si me parece un error

Otra tontería. Si consigues una función que haga un determinado trabajo de la forma más sencilla, me parece absurdo tirarla por la borda porque falte o deje de faltar una coma al final. Hay que subdividir los problemas hasta lo más sencillo posible y luego unirlos ¿Habéis oído hablar de Right() y Left() y concatenación? :P

Código: Visual Basic
  1.  
  2. aux = ConvertAscii("Vaya códigos")
  3. 'aux sin coma al final
  4. aux = Left(aux, Len(aux) - 1)
  5. [...]
  6. a_convertir = "55,56,57,58"
  7. 'necesitamos una coma al final
  8. aux = ConvertString(a_convertir & ",")
  9.  
  10.  

¡Vaya complicación, no?  :lol:

F_Tanori

  • Moderador
  • ******
  • Mensajes: 1919
  • Nacionalidad: mx
    • Ver Perfil
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #24 en: Martes 16 de Septiembre de 2008, 10:43 »
0
Cita de: "m0skit0"
En cuanto a F_tanori...

Cita de: "F_Tanori"
ocurrira un error sin una coma al final lo cual a mi si me parece un error


Otra tontería. Si consigues una función que haga un determinado trabajo de la forma más sencilla, me parece absurdo tirarla por la borda porque falte o deje de faltar una coma al final. Hay que subdividir los problemas hasta lo más sencillo posible y luego unirlos ¿Habéis oído hablar de Right() y Left() y concatenación?  :P  

Tirarla por la borda? de que hablas willy?

A que hora dije que "no servia", el fin de esto era "resolver el problema" , todos tenemos formas programacion diferente, asi como la resolucion de problemas  y jamas dije que tu funcion no sirviera, pero creo que en todo el hilo tus funciones no cumplian (por eso es un error lo de la coma) con lo que tenian que hacer segun el problema planteado (que era solo un ejercicio) puedes hacer la funcion mas optimizada para sumar y decir que se ejecuta en el menor tiempo posible , pero tiene un problema cuando agregas mas de 2 numeros no suma, pero no es un error porque se puede arreglar   :o   :)  

en fin...

y si he oido de lo que me preguntas ? tienes algun problema para comprenderlo ? ocupas alguna explicacion ? :P


Saludos
" ExIsTo y A vEcEs PiEnSo "

NOTA:
===========================================================================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
===========================================================================================================================