• Sábado 21 de Diciembre de 2024, 11:48

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

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #25 en: Martes 16 de Septiembre de 2008, 11:41 »
0
¿Hay algun problema en utilizar más de una función, o tiene que ser una y sólo una? Pues entonces no veo donde está el error...  -_-

Cita de: "F_Tanori"
pero tiene un problema cuando agregas mas de 2 numeros no suma

Bueno, no exageres, en todo caso sería que devuelve el número en real y no en entero  :lol:

P.D: Pido disculpas por lo de la longitud de la cadena, no me había dado cuenta en un principio...
P.D(2): No sé quién es Willy...  :D

F_Tanori

  • Moderador
  • ******
  • Mensajes: 1919
  • Nacionalidad: mx
    • Ver Perfil
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #26 en: Martes 16 de Septiembre de 2008, 17:30 »
0
Cita de: "m0skit0"
P.D(2): No sé quién es Willy...  :D

Era una serie de television de ya hace algunos años se llamaba Blanco y Negro o Diff'rent Strokes la frase es "un poco famosa" :P

http://www.youtube.com/watch?v=Qw9oX-kZ_9k


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
===========================================================================================================================

Jimbenit

  • Miembro MUY activo
  • ***
  • Mensajes: 269
  • Nacionalidad: co
    • Ver Perfil
    • http://ingenieriacivil.foroactivo.com
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #27 en: Martes 16 de Septiembre de 2008, 17:42 »
0
Ya no quieren seguir jugando a las funciones de texto???

Nota:
Esto les serviría mucho a los novatos (como yo)  B)


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 #28 en: Jueves 18 de Septiembre de 2008, 13:06 »
0
Yo sigo con mi programación funcional en VB ( :lol:  :lol: )

Código: Visual Basic
  1.  
  2. Public Function InvertirCadena(ByVal str As String) As String
  3.     If Len(str) <= 1 Then
  4.         InvertirCadena = str
  5.     Else
  6.         InvertirCadena = Right(str, 1) & InvertirCadena(Left(Right(str, Len(str) - 1), Len(str) - 2)) & Left(str, 1)
  7.     End If
  8. End Function
  9.  
  10.  

Cuidado con quedarse sin pila XD

F_Tanori

  • Moderador
  • ******
  • Mensajes: 1919
  • Nacionalidad: mx
    • Ver Perfil
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #29 en: Jueves 18 de Septiembre de 2008, 22:55 »
0
Cita de: "m0skit0"
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 ...

Exacto ya que en VB6 ya existe esa funcion se llama strreverse(str)

Cita de: "m0skit0"
Yo sigo con mi programación funcional en VB ( :lol:  :lol: )

Código: Visual Basic
  1.  
  2. Public Function InvertirCadena(ByVal str As String) As String
  3.     If Len(str) <= 1 Then
  4.         InvertirCadena = str
  5.     Else
  6.         InvertirCadena = Right(str, 1) & InvertirCadena(Left(Right(str, Len(str) - 1), Len(str) - 2)) & Left(str, 1)
  7.     End If
  8. End Function
  9.  
  10.  

Cuidado con quedarse sin pila XD


 aunque como ejercio esta bien; solo que deberias de usar el parametro ByRef para utilizarlo como "puntero" y no estarlo pasando como copia a cada llamado de la funcion

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
===========================================================================================================================

Jimbenit

  • Miembro MUY activo
  • ***
  • Mensajes: 269
  • Nacionalidad: co
    • Ver Perfil
    • http://ingenieriacivil.foroactivo.com
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #30 en: Jueves 18 de Septiembre de 2008, 23:21 »
0
^_^Vaya palabras has citado F_Tanori.


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 #31 en: Viernes 19 de Septiembre de 2008, 02:53 »
0
Bueno comentaros que el otro día respondí, pero era hora de cenar y no había terminado el mensaje después al enviar no me di cuenta de que habría caducado la sesión, me deslogó y me dió pereza reconstruir el mensaje (porqué estos foros no pueden recuperar el mensaje, hace 10 años se entiiende pero hoy día esto es intolerable, en fin...)

Mencionaba que yo no considero un error una coma al final, de más o de menos ya que de hecho la función que presentaba ilson quedaba 'guarreada' precisamente por querer mantener esa coma y por lo del númerito delante que 'pa qué ?'. La coma no estorba porque a menudo debe concatenarse un resultado con otro y por tanto suele tenerse que meter cuando en la función se lo extrajo.

También os presentaba otra manera de resolver la función sencilla y con mucha claridad aunque ligeramente más lenta.

Señalaba que la función de Nilson puede mejorarse a lo siguiente (prescindiendo del numerito que no sirve para nada y que lleva siempre coma al final excepto que sólo haya un carácter.)

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.    
  7.         cadena = ""
  8.         'If CadenaNormal = "" Then Exit Function
  9.         If Len(CadenaNormal) > 16383 Then
  10.              MsgBox "Existen posibilidades de que se produzca un error..."
  11.         End If
  12.        
  13.         For k = 1 To Len(CadenaNormal)  ' el último carácter lo quedamos fuera del bucle
  14.           cadena = cadena & Asc(Mid$(CadenaNormal, k, 1)) & ","
  15.         Next ' al finalizar el bucle, k todavía aumenta en 1
  16.  
  17.     CadenaASCII = cadena
  18.     Exit Function
  19.    
  20. errorSobrepasa:
  21.      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)
  22.      CadenaASCII = cadena
  23. End Function
  24.  
  25.  
  26.  


Yo proponía la siguiente función ligeramente más lenta que esta anterior pero bastante más clara y breve
Código: Visual Basic
  1.  
  2. ' bytes con comas
  3. Private sub Cadena_A_BytesCC(byref cadena As String, optional concat as string=",")  ' nótese el byref puesto a propósito
  4.          Dim s() As String
  5.        
  6.         ReDim s(0 To Len(cadena))
  7.         For k = 1 To Len(cadena)
  8.             s(k) = Asc(Mid$(cadena, k, 1))
  9.         Next
  10.        
  11.         cadena= Join(s, concat)
  12. End Function
  13.  
  14.  
De esta fnción decir que la coma en vez de aparecer al final aparecerá al principo, para el caso es lo mismo siempre que se tenga en cuenta.
Como puede verse a esta función le he añadido un parámetro opcional que sirve para 'meter'  cualquier cadena y no sólo comas, lo que le daría más versatilidad sin apenas código adicional.

La función inversa resulta igualmente breve:
Código: Visual Basic
  1.  
  2.   ' nota la cadena puede empezar tanto con coma como con cifras, pero si empieza con coma debe ir detrás números, la cadena no puede acabar en coma, esta función es la pareja de la anterior, que deja cadenas con comas delante, no es pareja de una función que deje comas detrás.
  3.   Private Function convertir(cadena As String) As String
  4.       Dim s() As String, ini As Byte
  5.      
  6.      on local error goto errorChr
  7.       s = Split(cadena, ",")
  8.       ini = IIf(Left$(cadena, 1) = ",", 1, 0)
  9.    
  10.       For k = ini To UBound(s)
  11.           s(k) = Chr$(s(k))
  12.       Next
  13.       convertir = Join(s, "")
  14.      exit function
  15. errorChr:
  16.      msgbox "La cifra ' " & s(k) & " ' no está dentro del rango 0-255 (byte)" & err.description
  17.    End Function
  18.  
  19.  
se supone que nunca habría de ocurrir chr$(23456) si se creó usando la otra función.... pero bueno se ha incluído un tratamiento de error...
Y en otro momento os coloco una función que totaliza las palabras que hay en un texto, para lo que pide nuestro amigo Nilson...
«Ma non troppo»
----> ModoVacaciones = False<----

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #32 en: Viernes 19 de Septiembre de 2008, 09:23 »
0
Citar
solo que deberias de usar el parametro ByRef para utilizarlo como "puntero" y no estarlo pasando como copia a cada llamado de la funcion

Entonces, ¿para qué queremos ByVal?  :lol:  :lol:

En teoría, no tienes razón: debería pasarse ByVal (por valor) porque no se va a modificar dicho parámetro, así el código queda más claro y entendible (aparte de poder cambiar de valor el parámetro sin que se modifique en el código llamante).

En la práctica, tienes razón, porque el código corre más deprisa pasando sólo un puntero (ByRef, por referencia) en vez de hacer la copia de la variable.

Lo que me lleva a preguntarles:
¿Qué creen que compensa más: que el código se ejecute más rápido o que sea más legible?  &lt;_&lt;

Jimbenit

  • Miembro MUY activo
  • ***
  • Mensajes: 269
  • Nacionalidad: co
    • Ver Perfil
    • http://ingenieriacivil.foroactivo.com
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #33 en: Viernes 19 de Septiembre de 2008, 15:43 »
0
La conversación ahora gira entorno a la legibilidad y a la rapidez...  
Pero pensando bien... esto es lo que realmente importa de un codigo...  B), pero para el nivel de principiante (para lo que este foro fue creado), creo que esta bien.... pero es muy, muy interesante ver los codigos de programadores EXPERTOS (como ustedes) &lt;_&lt;  resolviendo aquello que los chiquillos hacen (como yo), sin lugar a dudas es fantastico poder interactuar con ustedes  :good:

Saludos y gracias por lo que me enseñan... (como podré agradecerles esto???)


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 #34 en: Sábado 20 de Septiembre de 2008, 04:24 »
0
Algunas teorias indican que hay que darle prioridad , al lector (del codigo) es decir que sea mas entendible,pero en lo personal creo que es mas importante la rapidez y eficientación de recursos , y quien no lo entienda debera informarse un poco mas :P

* En este caso aun usando ByRef no se modifica la variable

Código: Text
  1. ... InvertirCadena(ByRef str As String) ...
  2.  

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
===========================================================================================================================

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #35 en: Sábado 20 de Septiembre de 2008, 11:39 »
0
Cita de: "m0skit0"
Lo que me lleva a preguntarles:
¿Qué creen que compensa más: que el código se ejecute más rápido o que sea más legible?  &lt;_&lt;
Interesante pregunta. A título personal (porque de forma general dudo que pueda darse una respuesta exacta.... y que todo el mundo esté de acuerdo) creo que uno tiene que hacer un balance en su código.

Esto es, si tu programa vuela entonces puedes darle más importancia a la legibilidad y la brevedad (a menudo están reñidos otras no), en cambio si el programa adolece de lento, no es plan pretender ser tan legible. a menudo la falta de claridad en un programa la acabamos supliendo con comentarios. También cuenta si tu código ha de pasar por otras manos distintas a las tuyas, ahí la claridad tiene más importancia. Por otro lado a medida que los procesadores son más rápidos y las memorias más grandes tiene menos relevancia la velocidad. Lo importante es que uno sepa fijar el límite.

Por ejemplo uno puede escribir un código denso y oscuro en 5000 líneas y ser muy veloz en cambio quizás puede hacer lo mismo con sólo 500 líneas pero recurriendo por ejemplo a librerías externas. El caso es que 500 líneas será un código más fácil de seguir pero por otro lado al ser las librerías externas implican cierto oscurantismo porque requiere estudiarse esas librerías, si son de uso frecuente como las API de windows, se hace mucho más llevadero pero cuando son de diferentes programas y un puñado de cada uno, tienes menos libertad vas a veces forzado por las limitaciones de las librerías y por la manera en que fueron programadas. entonces comparativamente quizás esas 5000 líneas densas y oscuras quizás compensen sobre esas 500. Pero como digo cada uno en su caso debe sopesarlo. dudo que pueda generalizarse si no es diviiidiendo en grupos e indicar si uno pertenece a ese grupo a tal vez al otro.
«Ma non troppo»
----> ModoVacaciones = False<----

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #36 en: Sábado 20 de Septiembre de 2008, 12:50 »
0
Aprovechando que tengo un rato libre voy a exponer una función que es posible que la tengais parecida o muy distinta, nunca se sabe.

La función como comentaba más arriba trata de contar las palabras que tiene un texto. Por comparativa (nuca se me ha ocurrido verificar antes el potencial de esta función) he realizado otra equivalente que al hilo de lo que venimos hablando es más breve pero tiene un rendimiento bastante menor.
A ambas funciones, como se aprecia se han 'inyectado' dentro de un bucle de 1000 reps. para comprobar diferencias ya que si no resulta difícil apreciarlo en su justa medida.

Código: Visual Basic
  1.  
  2.  
  3. Public Function Contar_Palabras1(texto As String) As Long
  4.     Dim txt() As String
  5.     Dim k As Long ' contador
  6.     Dim i As Long ' contador del bucle
  7.    
  8.     ti = Timer
  9.     For A = 1 To 1000
  10.         txt = Split(texto, " ")
  11.         If texto <> "" Then
  12.             If UBound(txt) = 0 Then
  13.                 If Trim$(txt(0)) <> "" Then
  14.                     Contar_Palabras1 = 0: GoTo salir ' Exit Function
  15.                 Else
  16.                     Contar_Palabras1 = 1: GoTo salir ' Exit Function
  17.                 End If
  18.             End If
  19.         End If
  20.        
  21.         For i = 0 To UBound(txt)
  22.             If txt(i) <> "" Then
  23.                 k = k + 1
  24.             End If
  25.         Next
  26.     Next
  27.     Contar_Palabras1 = k
  28.  
  29. salir:
  30.     MsgBox Timer - ti
  31.  End Function
  32.  
  33.  


La siguiente función es bastante menos lógica en cuanto a idearla, sirve de  contraste para la comparativa, usa un bucle do

Código: Visual Basic
  1.  
  2. Public Function Contar_Palabras2(texto As String) As Long
  3.     Dim k As Long  ' contador
  4.     Dim p As Long ' posición en la cadena
  5.     Dim txt As String '
  6.    
  7.     ti = Timer
  8.    
  9.         For A = 1 To 1000
  10.  
  11.         txt = Trim$(texto)
  12.         If txt = "" Then Contar_Palabras1 = 0: Exit Function
  13.        
  14.         Do
  15.             p = InStr(txt, " ") ' espacio entre comillas
  16.             If p > 0 Then       ' mientras haya espacio entrará aquí...
  17.                 k = k + 1
  18.                 txt = Trim$(Mid$(txt, p + 1)) ' elimino la palabra más a la izquierda y quito los espacios extras hasta la siguiente palabra.
  19.             Else                  ' cuando no haya más espacios, ya no quedan más palabras, devolvemos el resultado
  20.                k = k + 1
  21.                Exit Do
  22.             End If
  23.         Loop
  24.     Next
  25.     Contar_Palabras2 = k
  26.     MsgBox Timer - ti
  27. End Function
  28.  
  29.  

Puede notarse que si declaamos el parámetro byval la misma variable del parámetro podría usarse en vez de 'txt', que por otro lado ha sido forzado por el bucle de repetición externo.
Aunque parezcan muy similares, lo cierto es que los resultados son bastante diferenciados.

El texto empleado fue un archivo en la carpeta de windows, concretamente el de 'wmsetup.log' que en mi caso pesa 9'13kb. y contiene 1.056 palabras, con el bucle de 1000 repeticiones halló:

1.056.000 ----- 3'7 sg   funcion 1
1.056.000 -----16'01 sg. función 2

El resto del código para probarlo son 2 botones de llamada uno para cada función un label indicando las palabras encontradas y un richtextbox donde se carga el fichero y cuyo texto es el empleado.
El código 'extra' para probarlo es el siguiente:
Código: Visual Basic
  1.  
  2.     Private Sub Form_Load()
  3.     Rtxt.FileName = "C:WINDOWSwmsetup.log"
  4. End Sub
  5.  
  6. Private Sub Command1_Click()
  7.     Label1.Caption = "Palabras totales= " & Contar_Palabras1(Rtxt.Text)
  8. End Sub
  9.  
  10. Private Sub Command2_Click()
  11.     Label1.Caption = "Palabras totales= " & Contar_Palabras2(Rtxt.Text)
  12. End Sub
  13.  
  14.  
«Ma non troppo»
----> ModoVacaciones = False<----

ferhn

  • Miembro activo
  • **
  • Mensajes: 31
    • Ver Perfil
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #37 en: Sábado 20 de Septiembre de 2008, 17:07 »
0
Aca les dejo algo interesante para hacer casi de todo con texto

Esto lo hice dentro de un clase
Código: Text
  1.  
  2. Dim cTexto As String
  3. Dim dLetras As Integer
  4.  
  5. Dim i, SB, J As Integer
  6. Dim P() As String
  7. Dim POriginal As String
  8.  
  9. 'para las palabras
  10. Dim dPalabra As Integer
  11. Dim wordCount As Integer            ' Número de palabras en el documento
  12. 'Dim sourceText As String            ' Contiene el texto del documento para examinarlo
  13. Dim startFound, endFound As Integer ' Banderas para seguir la pista de las palabras encontradas
  14. Dim thisChar As String
  15. 'mayuscula
  16. Dim Mayu As String
  17. Dim Minus As String
  18. Dim DNormal As String
  19. Dim LetraSin As String
  20. Dim TextoReves As String
  21. Dim Fechas As Date
  22. Dim Hora As Date
  23.  
  24. Public Property Get CuentaLetras() As String
  25.     CuentaLetras = dLetras
  26. End Property
  27.  
  28. Public Property Let CuentaLetras(ByVal vNewTexto As String)
  29.     cTexto = vNewTexto
  30.     dLetras = Len(cTexto)
  31. End Property
  32.  
  33.  
  34. Public Property Get CuentaPalabra() As String
  35.     CuentaPalabra = wordCount
  36. End Property
  37.  
  38. Public Property Let CuentaPalabra(ByVal vNewValue As String)
  39.     ' Inicializar wordCount, offSet, y las banderas "Found"
  40.     wordCount = 0: offSet = 1: startFound = False: endFound = False
  41.     ' Copiar documento en variable (para examinarlo más rápidamente)
  42.    
  43.    
  44.     ' Examina cada carácter hasta llegar al final del documento.
  45.     Do Until offSet > Len(cTexto)
  46.         thisChar = Mid$(cTexto, offSet, 1)
  47.         If Not startFound Then
  48.             ' Buscar principio de palabra
  49.             startFound = isAlphaNumeric(thisChar)
  50.             If startFound Then wordCount = wordCount + 1
  51.         Else
  52.             ' Buscar final de palabra.
  53.             endFound = Not isAlphaNumeric(Mid$(cTexto, offSet, 1))
  54.             If endFound Then startFound = False: endFound = False
  55.         End If
  56.         offSet = offSet + 1
  57.     Loop
  58.        
  59.     'Visualizar el número de palabras
  60.     'MsgBox "Este documento contiene " & wordCount & " palabras."
  61. End Property
  62.  
  63. Private Function isAlphaNumeric(anyChar) As Integer
  64.     Select Case Asc(anyChar)
  65.         Case 65 To 90   'A a Z
  66.             isAlphaNumeric = True
  67.         Case 97 To 122  'a a z
  68.             isAlphaNumeric = True
  69.         Case 48 To 57   '0 a 9
  70.             isAlphaNumeric = True
  71.         Case 193, 225, 201, 233, 205, 237, 211, 243, 218, 250 'Á, É, Í, Ó, Ú, á, é, í, ó, ú
  72.             isAlphaNumeric = True
  73.         Case 220, 252   'Ü, ü
  74.             isAlphaNumeric = True
  75.         Case 209, 241   'Ñ, ñ
  76.             isAlphaNumeric = True
  77.         Case Else
  78.             isAlphaNumeric = False
  79.     End Select
  80. End Function
  81.  
  82. Public Property Get TodoMayus() As String
  83.     Mayu = StrConv(cTexto, vbUpperCase)
  84.     TodoMayus = Mayu
  85. End Property
  86.  
  87.  
  88. Public Property Get TodoMinus() As String
  89.     Minus = StrConv(cTexto, vbLowerCase)
  90.     TodoMinus = Minus
  91. End Property
  92.  
  93.  
  94. Public Property Get Normal() As String
  95.     Normal = DNormal
  96. End Property
  97.  
  98. Public Property Let Normal(ByVal vNewValue As String)
  99.     DNormal = vNewValue
  100. End Property
  101.  
  102.  
  103. Public Property Get PalabraExtraida(Text1 As TextBox, Numero As Integer)
  104.     Dim SB, J As Integer
  105.         SB = 1
  106.         For i = 1 To Len(Text1)
  107.                 If Mid(Text1, i, 1) <> " " Then
  108.                     ReDim Preserve P(SB)
  109.                     P(SB) = P(SB) & Mid(Text1, i, 1)
  110.                     J = i
  111.                 Else
  112.                     Do While Mid(Text1, i, 1) = " "
  113.                        i = i + 1
  114.                     Loop
  115.                     i = i - 1
  116.                     SB = SB + 1
  117.                 End If
  118.         Next i
  119.         If Numero <= SB Then
  120.             PalabraExtraida = P(Numero)
  121.             For i = 0 To SB - 1
  122.                 P(i) = ""
  123.             Next i
  124.         Else
  125.             MsgBox "No existe la palabra " & Numero, vbCritical, "Mensaje"
  126.             Text1.Text = ""
  127.         End If
  128. End Property
  129.  
  130. Property Get CantLetras(txtTexto As TextBox)
  131. Dim J As Integer
  132. Dim SB As Integer
  133. Dim S As String
  134.        
  135.         If Len(txtTexto.Text) <= 255 Then
  136.             For i = 1 To Len(txtTexto)
  137.                 S = Mid(txtTexto, i, 1)
  138.                 If S <> Chr(32) Then
  139.                     J = J + 1
  140.                 End If
  141.             Next i
  142.             CantLetras = J
  143.        End If
  144.  
  145.     CantLetras = CantLetras
  146. End Property
  147.  
  148. 'PARA TEXTO REVERSO
  149. Public Property Get TextReverso() As Variant
  150. TextoReves = StrReverse(cTexto)
  151.     TextReverso = TextoReves
  152. End Property
  153.  
  154. Public Property Get Fecha() As Date
  155. Fechas = Time(Label7.Caption)
  156. Fecha = Fechas
  157. End Property
  158.  
  159. Public Property Get Horas() As Date
  160. Hora = Time(LblHora.Caption)
  161. Horas = Hora
  162. End Property
  163.  
  164.  

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Podrian Publicar funciones para procesar Cadena de texto
« Respuesta #38 en: Miércoles 8 de Octubre de 2008, 12:12 »
0
Bueno ferhn, tu 'texto' admite varios comentarios....

Primero 2 incisos, el primero es que resulta visiblemente difícil de leer, acostúmbrate a usar el ( quitando las comillas simples)  '['code=vb']'  en vez de '['code=text']'... al colorear se ve mejor donde empizan y acaban las funciones, etc...

El 2º es que parece que has copiado el código de alguien y le has dado unos toques personales, al respecto te señalo que cuando hagas así o dejas todo en 'inglis' o lo cambias todo al español pero eso de tener un 'espanglis' a mi me produce cierta repulsión... encontrasem 'startFound' y 'TextoReves' me parece estar comunicando con un alien que oye cosas no las entiende pero confía en que el que lo reciba si. Esto es sólo una cuestión de estilo, no es algo grave pero da una indicación de el respeto hacia los demás si se adecúa el código, copiar y pegar sólo es señal de dejadez...

y ahora los comentarios...

Cita de: "ferhn"

Public Property Get CuentaLetras() As String
    CuentaLetras = dLetras
End Property
 
Public Property Let CuentaLetras(ByVal vNewTexto As String)
    cTexto = vNewTexto
    dLetras = Len(cTexto)
End Property
Esto carece de sentido la función len(texto) resuelve el caso,  no necesita por tanto travestirse de propiedad.

Cita de: "ferhn"

Public Property Get CuentaPalabra() As String
    CuentaPalabra = wordCount
End Property
 
Public Property Let CuentaPalabra(ByVal vNewValue As String)
Aquí varios comentarios, comentario 1 en la parte 'GET' puede verse también en el anterior. Si cuentapalabra suponemos que es una cifra a qué leches viene poner un 'string' ????. Yo te lo digo... a que haces algo impropio, algo impropio es asignar un valor a allgo que realmente no le pertenece, es como vestir a un mono de santo o como poner un remolque a un Formula-1. Al parecer no sabes cuando algo debe ser una propiedad y cuando una función. Yo te lo explico: si cuando introduces un dato es un tipo de datos y cuando debe devolver un dato devuelve un tipo de datos distinto al que se pedía como parámetro, eso es lo que describe una función. si el tipo de datos pasado por parámetro se ha de retener y en otra ocasión se puede pedir y es el mismo tipo de datos, eso es para usar como propiedad... si el parámetro se pasa e inmediatamente hace algo y ese dato no ha de quedar retenido eso es un método...

Por tanto comentario 2: (en la parte LET)  CuentaPalabraS (con S al final porque es plural cuanta muchas no una) debe ser una función... Te voy a decir que puede ocurrir si lo dejas como propiedad... si le pasamos como parámetro un texto de 30 mb. una vez que haya terminado de precesarlo como propiedad que es, guardaría el parámetro hasta que se inroduzca otro, o lo que es lo mismo, estarías reteniendo en memoria inútilmente datos que no se necesitan ya... tampoco hace falta que sea  30 Mb. para que esto sea una estupidez, pongo 30Mb. para que se vea claramente que lo es.

comentario: 3 Una propiedad debe retener 'memorizado' uno de sus parámetros, si se le pasa x parámetros y lo que retiene no es ninguno de ellos realmente no es una propiedad, es nuevamente una función si yo tengo la propiedad: Color_de_Pelo lo lógico es que el parámetros sea un color y adicionalmente otro u otros parámetros si fueran necesarios, pero la propiedad alamcenará el color tal como indica su nombre y al rescatar la propiedad será dicho valor el que he de devolver, si la propiedad es color_de_Pelo y le paso como parámetros 5 dedos, 2 pies y 3 camisas pero nunca el color del pelo, habrá alguien que sepa utilizar esa 'propiedad' ...?  realmente habría que llamarle monstruosidad...

comentario 4 el uso que se hace de esa función (CuentaPalabras) es dudoso y te explico porqué, recurre a la función 'isAlphaNumeric', para determinar ciertos casos, esto es algo relativo, es decir si exponemos un criterio para definir palabras distinto que estar separado blanco lo podremos utilizar perfectamente pero ya no podremos darle el carácter 'universal' de contar palabras, sino dado que es un caso relativo , relativizarlo así el nombre debería ser cambiado a por ejemplo 'ContarMisPalabras' lo cual ya hace referencia a un modo exclusivo y particular de realizar la cuenta. Y esto sin siquiera entrar a evaluar lo que sea que haga dicha función 'isAlphaNumeric'. Realmente una función de contar palabras podría ser tan simple como:

Código: Visual Basic
  1.  
  2. public function Contar_Palabras(texto as string) as long
  3.     dim s() as string, n as long
  4.  
  5.     if len(texto)=0 then
  6.            Contar_Palabras=0
  7.    else
  8.          if instr(texto," ")<>0 then
  9.              s=split(texto)
  10.             ' este bucle es necesario porque split corta por 1 espacio, es decir después de encontrar un espacio el siguiente carácter lo interpreta como una cadena
  11.              for k=0 to  ubound(s )          
  12.                   if s(k)<>"" then n=n +1
  13.              next
  14.              Contar_Palabras=  n
  15.         else
  16.              Contar_Palabras=1
  17.         end if
  18.     end if
  19. end function
  20.  
  21.  

Desde luego esto de contar palabras sigue siendo relativo, me explico esto es aplicable desde el punto de vista de la programación, pero para otros propósitos la lista debe volver a filtrarse, por ejemplo un retorno de carro (enter) puede aparecer unido al final de la apalabra anterior y la primera palabra de la siguiente línea sio no se dejó espacio al final de la misma. También, interpretamos una coma o un punto como una palabra ?, y los signos =,<,(, etc... y si una palabra está unida a operadores? por ejemplo: 'Velocidad=e/t' daría un valor diferente de 'Velocidad =e/t' y diferente de 'Velocidad = e / t', por eso para casos reales, contar plabaras es siempre una rutina complaja y que debe llevar aparejado un método a usar como parámetros donde en dicho/s parámetro/s se especifican las condiciones de lo que es una plabara y lo que no. En dicho caso el código presentado anteriormente presenta la 1ª fase, una vez determinado que el texto tiene más de una palabras, la matriz obtenida debe filtrarse sucesivamente por otra/s rutina/s específicas, lo ideal es que no haya que pasar la matriz para cada caso si no que una misma función analice varios casos relativos a un mismo tema en el mismo bucle... pero en general la rutina que presentas no debe inferirse como lo que su nombre indica, por las razones explicadas.


comentario 5 La función isAlphaNumeric (cada uno debe acomodarlo a como le valga) puede simplicarse mucho más, tanto como reducirlo todo a sólo 2 casos, pués sólo existen 2 casos, TRUE-FALSE, usando el mismo código te lo resumo:
Código: Visual Basic
  1.  
  2. Private Function isAlphaNumeric(anyChar) As Integer
  3.     Select Case Asc(anyChar)
  4.         Case 48 - 57,  65 - 90, 97-122, 193, 225, 201, 233, 205, 237, 211, 243, 218, 250, 220, 252 , 209, 241  
  5.             isAlphaNumeric = True
  6.        case else
  7.             isAlphaNumeric=false
  8.    end select
  9.  end function  
  10.  
  11.  

te ahorras montón de líneas inútiles y queda más claro, al hacer varios case, a primera vista parece que en cada uno hará una cosa distinta, y eso confunde.

comentario 6 estas funciones:
Cita de: "ferhn"
Public Property Get TodoMayus() As String ...   End Property
Public Property Get TodoMinus() As String ... End Property
Son inútiles por redundantes, como ya se dijo antes una función que resuleve un caso no debe trasvestirse, para hacer lo mismo pero ralentizándolo...


comentario 7 Esto creo que debo llevarlo a un laboratorio a analizar.... yo aún no he sido capaz de encontrarle sentido.
Citar
Public Property Get Normal() As String
    Normal = DNormal
End Property
 
Public Property Let Normal(ByVal vNewValue As String)
    DNormal = vNewValue
End Property

comentario 8
Cita de: "ferhn"

Public Property Get PalabraExtraida(Text1 As TextBox, Numero As Integer)
Te complicas en exceso, para eso existe la función INSTR . Con instr vas comprobando donde empiza y terminan las palabras... ya que leer carácter a carácter es bastante lento, conviene delegar en una función más potente o recurrir a la API, para textos de pocas palabras puede valerte pero si por ejemplo tratas de buscar una texto en un dado número de ficheros la búsqueda sería muy lenta.

comentario 9 como ya dije anteriormente trasvestir una función es perder tiempo y tratar de convertirlo en una propiedad una aberración.
Cita de: "ferhn"

Public Property Get TextReverso() As Variant
TextoReves = StrReverse(cTexto)
    TextReverso = TextoReves
End Property

en cuanto a las fechas,  :wub:  sin comentarios...

Así que por favor en cuanto puedas corrige todo el texto o retíralo,  :hitcomp:  ya que no es precisamente un ejemplo sino de mala programación. La frase:
Cita de: "ferhn"
   Aca les dejo algo interesante para hacer casi de todo con texto
francamente resulta desacertada aparte de queen cuanto a completitud no representa nada.
 
Espero que no te lo tomes a mal sino como una orientación de que no se debe hacer   :beer:
«Ma non troppo»
----> ModoVacaciones = False<----