• Sábado 20 de Abril de 2024, 11:59

Autor Tema:  Leer De Un Txt!!!  (Leído 6543 veces)

Gandalf_malaga7

  • Miembro MUY activo
  • ***
  • Mensajes: 162
    • Ver Perfil
Leer De Un Txt!!!
« en: Martes 9 de Marzo de 2004, 13:40 »
0
Buenas!!!!!!!!!!!,
aquí os adjunto dos .txt porque necesito que me echeis una mano.Quiero crear un codigo que extraiga del archivo prueba1 la siguiente cadena: C8120CC, es decir que limpie todos los demás caracteres y me deje esa cadena en una variable o al principio de otro .txt.Igualmente del prueba2 me debe extraer la cadena CA7432CX,es decir le pase el .txt que le pase que se quede sólo con estas cadenas y elimine el resto (estas cadenas son mátriculas os lo comento por si os sirve de ayuda).Necesito esto porque despues compararé estas cadenas con las mátriculas de una base de datos.
Una ayudilla por favor que tengo que entregar esto ya mismo,
gracias a todos.
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.
...Gandalf El Gris,ese era mi nombre;soy Gandalf El Blanco y en los albores de la tempestad vuelvo a vosotros.

Brroz

  • Miembro de PLATA
  • *****
  • Mensajes: 1058
    • Ver Perfil
Re: Leer De Un Txt!!!
« Respuesta #1 en: Martes 9 de Marzo de 2004, 15:13 »
0
Hola Gandalf_malaga7.

Aquí te adjunto un ejemplo de una función que puede servir para lo que quieres:

Código: Text
  1.  
  2. Private Function BuscarCadenaEnArchivo(ByVal FilePathFileName As String, ByVal Cadena As String, Optional ByVal Desde As Long, Optional ByVal CaseSens As Boolean) As Long
  3.  
  4.     If Cadena = "" Then Exit Function
  5.  
  6.     On Error GoTo Err_Buscar
  7.  
  8.     Dim intCanal As Integer
  9.     intCanal = FreeFile
  10.     Open FilePathFileName For Binary As intCanal
  11.  
  12.     Dim bytBufR() As Byte
  13.     ReDim bytBufR(LOF(intCanal) - Desde)
  14.    
  15.     If Desde = 0 Then Desde = 1
  16.     Get #intCanal, Desde, bytBufR
  17.    
  18.     On Error Resume Next
  19.    
  20.     Dim lng1 As Long, int1 As Integer
  21.     Dim indEncontrado As Boolean, str1 As String
  22.     If CaseSens Then
  23.         For lng1 = 0 To UBound(bytBufR)
  24.             str1 = str1 & Chr(bytBufR(lng1))
  25.             If Right(str1, Len(Cadena)) = Cadena Then
  26.                 BuscarCadenaEnArchivo = lng1 - Len(Cadena) + Desde + 1
  27.                 Exit For
  28.             End If
  29.         Next lng1
  30.     Else
  31.         Cadena = UCase(Cadena)
  32.         For lng1 = 0 To UBound(bytBufR)
  33.             str1 = str1 & UCase(Chr(bytBufR(lng1)))
  34.             If Right(str1, Len(Cadena)) = Cadena Then
  35.                 BuscarCadenaEnArchivo = lng1 - Len(Cadena) + Desde + 1
  36.                 Exit For
  37.             End If
  38.         Next lng1
  39.     End If
  40.  
  41. Exit_Buscar:
  42.     On Error Resume Next
  43.     Close #intCanal
  44.     Exit Function
  45.  
  46. Err_Buscar:
  47.     MsgBox "(" & Err.Number & ") " & Err.Description _
  48.     , vbCritical, "Encontrar cadena"
  49.     Resume Exit_Buscar
  50.    
  51. End Function
  52.  
  53.  

Tan solo unas consideraciones:

La función recibe como parámetros el archivo en el que buscar, la cadena que hay que localizar (obligatorios), la posición a partir de la cual buscar y la opción de distinguir mayúsculas y minúsculas (opcionales). Devuelve un número que corresponde con la posición inicial de la cadena si se encuentra, o 0 en caso contrario.

Si el archivo en el que quieres buscar es muy grande, sería recomendable leer el archivo por partes, redimensionando la matriz bytBufR a un tamaño apropiado y realizando un ciclo con tantas instrucciones Get como fuesen necesarias para completar la longitud del fichero... esto queda para ti, que no se puede pedir todo hecho.

Habrás observado que los bucles se podrían resumir en uno sólo, integrando los if dentro del bucle... Esto último haría la búsqueda notablemente más lenta:
en muchas ocasiones prefiero escribir de más, incluso repitiendo fragmentos de código en sacrificio de un mejor rendimiento en la ejecución (evidentemente el bucle se ejecutará antes cuantas menos preguntas e instrucciones haya por el medio).

Eso es todo, espero que esto te sirva, mago malagueño.

Suerte.

Gandalf_malaga7

  • Miembro MUY activo
  • ***
  • Mensajes: 162
    • Ver Perfil
Re: Leer De Un Txt!!!
« Respuesta #2 en: Martes 9 de Marzo de 2004, 15:51 »
0
Muchas gracias tío!!!!!!!!!,
me has dado una idea de como realizar la búsqueda.Mi programa lo que hace es lo siguiente:
1)Capturo una foto con texto
2)Reconozco las cadenas de caracteres en la foto las cuales se almacenan en un .txt (pero  aparte de las cadenas se me meten caracteres erroneos y a lo mejor mi cadena tiene un espacio en medio o alguno de estos caracteres en medio).
3)comparo la cadena del .txt con un campo de una base de datos(para ver si pertenece a mi base o no).

Entonces con tu función he pensado que puedo realizar una busqueda por cada cadena de ese campo de mi base de datos.
Se pueden usar comodines en la búsqueda?
...Gandalf El Gris,ese era mi nombre;soy Gandalf El Blanco y en los albores de la tempestad vuelvo a vosotros.

Brroz

  • Miembro de PLATA
  • *****
  • Mensajes: 1058
    • Ver Perfil
Re: Leer De Un Txt!!!
« Respuesta #3 en: Martes 9 de Marzo de 2004, 16:44 »
0
Hola Gandalf_malaga7.

Si examinas el código te darás cuenta que no está pensado para utilizar comodines, sin embargo, no sería muy complicado hacer las modificaciones necesarias para que funcionara de tal forma. Ánimo.

Abur.

Gandalf_malaga7

  • Miembro MUY activo
  • ***
  • Mensajes: 162
    • Ver Perfil
Re: Leer De Un Txt!!!
« Respuesta #4 en: Miércoles 10 de Marzo de 2004, 19:42 »
0
Hola de nuevo!!!!!!!!!!!!!,

oye Brroz,muchas gracias  :D por la función que me mandaste pero no me dejan usarla,los datos que yo tengo que sacar de los .txt que os adjunto son matriculas,y una vez sacadas tengo que buscar si se encuentran en mi base de datos para ver si esos coches pueden acceder a mi recinto o no.Así que para usar tu función tendría que ir buscando todas las matriculas de mi base de datos en los .txt  :huh: y esto no resulta muy optimo informaticamente para mis jefes :blink: .

Más bien necesito algo de busqueda de patrones ó simplemente una función que me vaya eliminando toda la 'mierda' de mi .txt (me refiero a cualquier caracter que no puede salir en una mátricula,es decir guiones,interrogaciones,espacios en blanco...),y me deje finalmente mi matricula, :smartass:
a ver si me podeis ayudar,gracias!!!!!!!!!!!!! :comp:
...Gandalf El Gris,ese era mi nombre;soy Gandalf El Blanco y en los albores de la tempestad vuelvo a vosotros.

elmango80

  • Miembro MUY activo
  • ***
  • Mensajes: 149
  • Nacionalidad: ve
    • Ver Perfil
Re: Leer De Un Txt!!!
« Respuesta #5 en: Jueves 11 de Marzo de 2004, 07:30 »
0
Hola Gandalf_malaga7!

Te aconsejo que una vez que tengas tu cadena obtenida del .txt en primer lugar la depures, osea saca todos los posibles caracteres que no puedan estar en una matricula (" - $ % @) y asi solo te quedas con las letras y los numeros, tambien puedes sacar todas la letras minusculas porque se supone que la matricula solo esta compuesta de numero y letras mayusculas, ya con esto te ahorras un trabajo, despues podrias hacer un patron de la placa, no se como sera haya pero aca en Venezuela las placas poseen tres letras despues dos numeros y por ultimo otra letra (ASD 32F) asi que busca ese patron dentro de la cadena que te queda...

P.D: Gracias por la informacion del programa que encontraste...

:devil: ------------------ :angel:
Citar
No soy bueno, tampoco soy malo sino todo lo contrario...

Brroz

  • Miembro de PLATA
  • *****
  • Mensajes: 1058
    • Ver Perfil
Re: Leer De Un Txt!!!
« Respuesta #6 en: Jueves 11 de Marzo de 2004, 09:39 »
0
Hola Gandalf_malaga7.

Tal como lo cuentas, tus jefes tienen toda la razón... recorrer toda una tabla para buscar por cada registro en un archivo de texto, no es nada operativo (a no ser que tengas poquísimos registros y el archivo de texto sea pequeño, claro).

Lo que te apuntan de buscar un patrón para las matrículas y eliminar todo lo que no cuadre con ese patrón del archivo de texto, puede ser el camino, pero... ¿lo normal no sería que las matrículas aparecieran en determinadas posiciones del txt, o que incluso apareciese una sóla matrícula?¿El txt lo obtienes tú?

Por otro lado,si aparece más de una matrícula y si eliminas todos los carácteres y/o secuencias que pueden no aparecer en una matrícula, luego tendrás que identificar en lo que te quede las posibles matrículas, y se podrían dar casos como este:
PO3425ZA2332KM2344CC9999DCC2222AABC4355
(PO-3425-Z , A-2332-K , M-2344-C , C-9999-D , CC-2222-A , ABC4355)
Desde luego que no es un obstáculo insalvable, ni mucho menos, pero ve imaginando ya lo que tendría que hacer el proceso tras filtrar en el txt las posibles matrículas.

Todo esto te lo cuento sin haber descargado tus adjuntos, por lo que no sé si a lo mejor existe la posibilidad de que las matrículas aparezcan en determinadas posiciones fijas (en un campo de un registro, vaya) o que cierto/s carácter/es delimiten una matrícula. ¿Has examinado el txt para ver si se da alguna de estas posibilidades?

Suerte.

Chao.

Gandalf_malaga7

  • Miembro MUY activo
  • ***
  • Mensajes: 162
    • Ver Perfil
Re: Leer De Un Txt!!!
« Respuesta #7 en: Jueves 11 de Marzo de 2004, 10:59 »
0
Hola a todos!!!!!!!!,
gracias Brroz y Elmango80:beer:  por la ayuda,te explico Brroz:
si descargas mi adjunto verás que solo puede haber una mátricula por .txt,ya que yo le hago las fotos a los coches de uno en uno,y cada foto la someto a una OCR mediante una libreria que tengo,y esta OCR me genera mucha mierda y en una posición cualquiera la mátricula :angry: .
A ver si me puedes ayudar :comp: ,me podrias pasar el codigo de un algoritmo que coja el .txt,lo recorra de principio a fin y elimine cualquier caracter excepto mayusculas y numeros(incluidos espacios en blanco) asi al final en mi .txt me quedara la matricula pegada al margen izquierdo y en la primera linea.Yo ya tengo hecho los algoritmos para una vez limpiado el .txt,leer la matricula y buscarla en mi base de datos.Solo me falta este y debido a mis carencias :unsure: en conocimiento de codigo no se como hacerlo,
espero vuestra respuesta,muchas gracias :angel: !!!!!!!!!!!!!!!!!
...Gandalf El Gris,ese era mi nombre;soy Gandalf El Blanco y en los albores de la tempestad vuelvo a vosotros.

9tnix

  • Miembro MUY activo
  • ***
  • Mensajes: 165
  • Nacionalidad: pe
    • Ver Perfil
Re: Leer De Un Txt!!!
« Respuesta #8 en: Jueves 11 de Marzo de 2004, 11:23 »
0
Salu2 Gandalf_malaga7

Hola amigo lo que puedes hacer es lo siguiente es solo una idea ojala y me alcance el tiempo te pongo el codigo del programa pero mientras va la sugerencia.

Lee cada uno de los archivos y lo abres con la instruccion Open
Luego extrae la cadena en una variable y empieza a hacer una busqueda utilizando el patron que ya lo tienes bueno usa la funcion Instr(<desde que caracterer de la cadena empieza la busqueda>,<Cadena donde se busca>, <cadena buscada> ), esta funcion te devuelve >0 cuando encontro lo que buscas sino devuelve <=0, una vez que encontraste todos los patrones en el primer archivo pues lo separas y lo guardas donde sea necesario y sigues adelante con los demas archivos hasta que termines.

Ejemplo de Instr

Dim strCadena As String
Dim strCadBuscar As String
Dim Pos as Integer
strCadena = "ASdkashdkaHola amigosasdi54654"
strCadenaBuscar = "Hola amigos"
'//Esto te devuelve la posicion en donde se encuentra la cadena en este caso 11
Pos = Instr(1,strCadena, strCadenaBuscar)
'//Aki sacamos la cadena Hola aamigo
msgbox Mid(strcadena, pos, len(strCadenaBuscar))

Espero que la info ayude

Un saludo zeekel ®
[KGT]
TP-Systems
our knowledge is our power!

Brroz

  • Miembro de PLATA
  • *****
  • Mensajes: 1058
    • Ver Perfil
Re: Leer De Un Txt!!!
« Respuesta #9 en: Jueves 11 de Marzo de 2004, 11:51 »
0
Hola.

Necesitarás algo así:

Código: Text
  1.  
  2. Private Function ProcesarTxt(ByVal InputFile As String) As String
  3.  
  4.     On Error GoTo Err_Procesar
  5.    
  6.     Dim intCanal As Integer
  7.     intCanal = FreeFile
  8.     Open InputFile For Binary As intCanal
  9.    
  10.     Dim bytBufR() As Byte
  11.     ReDim bytBufR(LOF(intCanal))
  12.     Get #intCanal, , bytBufR
  13.        
  14.     Dim lng1 As Long
  15.     For lng1 = 0 To UBound(bytBufR)
  16.         If (bytBufR(lng1) &#60; 91 And bytBufR(lng1) &#62; 47) _
  17.         And (bytBufR(lng1) &#60; 58 Or bytBufR(lng1) &#62; 64) Then _
  18.         ProcesarTxt = ProcesarTxt & Chr(byBufR(lng1))
  19.     Next lng1
  20.    
  21. Exit_Procesar:
  22.     On Error Resume Next
  23.     Close #intCanal
  24.     Exit Function
  25.  
  26. Err_Procesar:
  27.     MsgBox &#34;(&#34; & Err.Number & &#34;) &#34; & Err.Description _
  28.     , vbCritical, &#34;Procesar archivo txt&#34;
  29.     Resume Exit_Procesar
  30.    
  31. End Function
  32.  
  33.  

Abur.

Gandalf_malaga7

  • Miembro MUY activo
  • ***
  • Mensajes: 162
    • Ver Perfil
Re: Leer De Un Txt!!!
« Respuesta #10 en: Jueves 11 de Marzo de 2004, 12:45 »
0
Hey colegas,muchas gracias :D ,
Brroz,he provado tu función llamandola de la siguiente forma:

Private Sub Command1_Click()

    ProcesarTxt "C:\Prueba3.txt"

End Sub

pero cuando abro el Prueba3.txt despues de ejcutarlo no esta modificado,esta igual que antes,que puede fallar?

el dia que funcione esto  os invito a todos a la feria de Malaga,ole :kicking: !!!!!!!!!!!!!!!!!!
...Gandalf El Gris,ese era mi nombre;soy Gandalf El Blanco y en los albores de la tempestad vuelvo a vosotros.

Brroz

  • Miembro de PLATA
  • *****
  • Mensajes: 1058
    • Ver Perfil
Re: Leer De Un Txt!!!
« Respuesta #11 en: Jueves 11 de Marzo de 2004, 14:57 »
0
Hola Gandalf_malaga7.

Fíjate que la función devuelve un string que debe contener la supuesta matrícula, o lo que queda del fichero después de filtrarlo...

Código: Text
  1.  
  2. Private Sub Command1_Click()
  3.     Dim str1 As String
  4.     str1 = ProcesarTxt(&#34;C:&#092;Prueba3.txt&#34;)
  5.     MsgBox str1
  6.  
  7.  

Después de llamar a la función, 'str1' contendrá el valor devuelto por la misma.
Chao.

Gandalf_malaga7

  • Miembro MUY activo
  • ***
  • Mensajes: 162
    • Ver Perfil
Re: Leer De Un Txt!!!
« Respuesta #12 en: Jueves 11 de Marzo de 2004, 16:55 »
0
Gracias tio,
ahora funciona perfect,ojala tuviera yo ese facilidad pa crear codigo :comp: ,
bueno esto es solo el principio ya os ire contando como va la aplicacion,
mil gracias :hola:
...Gandalf El Gris,ese era mi nombre;soy Gandalf El Blanco y en los albores de la tempestad vuelvo a vosotros.

elmango80

  • Miembro MUY activo
  • ***
  • Mensajes: 149
  • Nacionalidad: ve
    • Ver Perfil
Re: Leer De Un Txt!!!
« Respuesta #13 en: Viernes 12 de Marzo de 2004, 06:25 »
0
Hola Gandalf_malaga7 y Brroz!

Por lo visto tu programa ya esta casi listo FELICITACIONES!!!!

 :bravo: :kicking: :bravo: :kicking:
Citar
No soy bueno, tampoco soy malo sino todo lo contrario...

9tnix

  • Miembro MUY activo
  • ***
  • Mensajes: 165
  • Nacionalidad: pe
    • Ver Perfil
Re: Leer De Un Txt!!!
« Respuesta #14 en: Viernes 12 de Marzo de 2004, 15:47 »
0
Hola chicos

Genial Genial, todo sea por amor al soft y al desarrollo jejeje xDDD :D
FELICIDADES Gandalf_malaga7

un saludo Brroz
un saludo Gandalf_malaga7
un saludo elmango80

zeekel ®
[KGT]
TP-Systems
our knowledge is our power!

Gandalf_malaga7

  • Miembro MUY activo
  • ***
  • Mensajes: 162
    • Ver Perfil
Re: Leer De Un Txt!!!
« Respuesta #15 en: Lunes 15 de Marzo de 2004, 12:01 »
0
Que pasa!!!!!!! :hola: ,
no me deis la enhorabuena todavía que el programa aún no está terminado,queda una pequeña parte.Primero muchas gracias Brroz porque el algoritmo del otro día me vino de #### madre :kicking: .A ver si me podeis echar una mano con una cosilla,es lo que me falta pa acabar:

Vamos a ver,mi OCR me generaba un .txt no?,este .txt contiene una mátriula(entera o a lo mejor 5 caracteres de 8) y mucha mierda,con el algoritmo que me pasó Brroz al final me queda por ejemplo lo siguiente: "FVM8432DZEZ",donde mi mátricula es M8432DZ y el resto no me sirve.El resultado podría ser por ejemplo también 8432C y que me faltara la primera y la última letra.Dicho esto ,yo tengo una base de datos done uno de los campos es matricula,y tendré unas 40 mátriculas.Necesito ver si la matricula que tengo en mi .txt(ya sabeis camuflada con otros caracteres inutiles) se encuentra en mi base de datos o no.No tengo ni idea de como hacer esto, :( ,si alguno puede aportarme alguna ó incluso el código de algún algoritmo, :comp: ,estaré eternamente agradecido, y por supuesto no hace falta decir que si alguien quiere conocer más acerca de lo que estoy desarrollando o que le pase código o lo que sea no tiene más que decirlo!!!!!!!!!,
Grracias y espero Que me hagais ver la luz :lightsabre: !!!!!!!!!!
...Gandalf El Gris,ese era mi nombre;soy Gandalf El Blanco y en los albores de la tempestad vuelvo a vosotros.

Brroz

  • Miembro de PLATA
  • *****
  • Mensajes: 1058
    • Ver Perfil
Re: Leer De Un Txt!!!
« Respuesta #16 en: Lunes 15 de Marzo de 2004, 17:53 »
0
Hola Gandalf_malaga7.

Tal vez ya hayas resuelto tu problema, pero por si acaso, te cuento:

Con la cadena resultante de la función, yo establecería otro filtro, obteniendo una cadena formada sólo por números, luego con el resultado ejecutaría una selección de registros en tu bd con un SQL de este estilo:

Código: Text
  1.  
  2. Dim strSQL as string
  3. strSQL = &#34;SELECT * FROM TablaMatriculas WHERE CampoMatricula LIKE '%&#34;
  4. & LlamadaAFuncionSoloNumeros(ResultadoFnAnterior) & &#34;%'&#34;.
  5.  
  6.  

Recorrería el recordset resultante, buscando la mejor coincidencia...
Podrías sofisticar más la última función para que por ejemplo buscase una cadena de números con una letra a izquierda y otra a derecha, o con tres letras a la izquierda de los cuatro números...

No sé si me habré explicado muy bien, pero tú pregunta, pregunta.

Abur.

Gandalf_malaga7

  • Miembro MUY activo
  • ***
  • Mensajes: 162
    • Ver Perfil
Re: Leer De Un Txt!!!
« Respuesta #17 en: Lunes 15 de Marzo de 2004, 23:12 »
0
Que tal Brroz,me mola tu idea,lo único malo es que la mierda que se me genera en el .txt no son solo letras,también tengo casos en los que se me generan numeros erroneos 4FVM8432DZEZ6,por ejemplo,sería valido tambien para esto?,la función 'LlamadaAFunciónSoloNumeros' te refieres a la que me pasaste la pasada semana ¿no? pero solo dejando los números. No se la verdad es que estoy bastante saturado y no se me ocurre como hacer esto ahora mismo,

Un saludo.
...Gandalf El Gris,ese era mi nombre;soy Gandalf El Blanco y en los albores de la tempestad vuelvo a vosotros.

Brroz

  • Miembro de PLATA
  • *****
  • Mensajes: 1058
    • Ver Perfil
Re: Leer De Un Txt!!!
« Respuesta #18 en: Martes 16 de Marzo de 2004, 11:34 »
0
Hola.

Con 'LlamadaAFunciónSoloNumeros' me refiero a una nueva función que realice un nuevo filtro sobre la anterior que te envié.

En este ejemplo, el método recibirá como entrada el resultado de la función ProcesarTxt("C:\ruta\archivo.txt") y una matriz por referencia que será modificada para que devuelva los elementos de grupos de 4 dígitos encontrados en la cadena. Fíjate:
Código: Text
  1.  
  2. Private Sub Command1_Click()
  3.  
  4. 'Este es el código que usabamos hasta ahora
  5.    Dim str1 As String
  6.    str1 = ProcesarTxt(&#34;C:&#092;Prueba3.txt&#34;)  
  7.  
  8. 'Aquí empieza el 2º filtro
  9.     Dim int4Numeros() As Integer
  10.     ExtraerGrupos4Numeros str1, int4Numeros
  11.    
  12. 'Aquí muestro los valores que deberías buscar
  13. 'en la db usando like
  14.     On Error Resume Next
  15.     Dim int1 As Integer
  16.     For int1 = 1 To UBound(int4Numeros)
  17.         MsgBox int4Numeros(int1)
  18.     Next int1
  19.  
  20. End Sub
  21.  
  22. Private Sub ExtraerGrupos4Numeros( _
  23. ByVal Txt As String, ByRef Numeros() As Integer)
  24.    
  25.     Dim intIdx As Integer
  26.     Dim int1 As Integer, str1 As String
  27.    
  28.     For int1 = 1 To Len(Txt) - 4
  29.        
  30.         str1 = Mid(Txt, int1, 4)
  31.        
  32.         If IsNumeric(str1) Then
  33.             intIdx = intIdx + 1
  34.             If intIdx &#62; 1 Then
  35.                 ReDim Preserve Numeros(intIdx)
  36.             Else
  37.                 ReDim Numeros(1)
  38.             End If
  39.             Numeros(intIdx) = str1
  40.         End If
  41.    
  42.     Next int1
  43.    
  44. End Sub
  45.  
  46.  

Recorre los elementos de la matriz que contiene los números, busca en la tabla de la bd las posibles correspondencias, recorre la selección intentando indentificar el valor del campo con la matricula completa en la cadena resultado de la función 'ProcesarTxt' (en el ejemplo str1). Es decir, algo así:
Código: Text
  1.  
  2. If Instr(1,str1,recordsetMatriculas.Fields(&#34;Matricula&#34;).value) &#62; 0 Then _
  3. MsgBox &#34;Has encontrado la matrícula, enhorabuena tronco...&#34;
  4.  
  5.  

Espero que me haya explicado bien...
Suerte.

Brroz

  • Miembro de PLATA
  • *****
  • Mensajes: 1058
    • Ver Perfil
Re: Leer De Un Txt!!!
« Respuesta #19 en: Martes 16 de Marzo de 2004, 11:36 »
0
Hola.

Con 'LlamadaAFunciónSoloNumeros' me refiero a una nueva función que realice un nuevo filtro sobre la anterior que te envié.

En este ejemplo, el método recibirá como entrada el resultado de la función ProcesarTxt("C:\ruta\archivo.txt") y una matriz por referencia que será modificada para que devuelva los elementos de grupos de 4 dígitos encontrados en la cadena. Fíjate:
Código: Text
  1.  
  2. Private Sub Command1_Click()
  3.  
  4. 'Este es el código que usabamos hasta ahora
  5.    Dim str1 As String
  6.    str1 = ProcesarTxt(&#34;C:&#092;Prueba3.txt&#34;)  
  7.  
  8. 'Aquí empieza el 2º filtro
  9.     Dim int4Numeros() As Integer
  10.     ExtraerGrupos4Numeros str1, int4Numeros
  11.    
  12. 'Aquí muestro los valores que deberías buscar
  13. 'en la db usando like
  14.     On Error Resume Next
  15.     Dim int1 As Integer
  16.     For int1 = 1 To UBound(int4Numeros)
  17.         MsgBox int4Numeros(int1)
  18.     Next int1
  19.  
  20. End Sub
  21.  
  22. Private Sub ExtraerGrupos4Numeros( _
  23. ByVal Txt As String, ByRef Numeros() As Integer)
  24.    
  25.     Dim intIdx As Integer
  26.     Dim int1 As Integer, str1 As String
  27.    
  28.     For int1 = 1 To Len(Txt) - 4
  29.        
  30.         str1 = Mid(Txt, int1, 4)
  31.        
  32.         If IsNumeric(str1) Then
  33.             intIdx = intIdx + 1
  34.             If intIdx &#62; 1 Then
  35.                 ReDim Preserve Numeros(intIdx)
  36.             Else
  37.                 ReDim Numeros(1)
  38.             End If
  39.             Numeros(intIdx) = str1
  40.         End If
  41.    
  42.     Next int1
  43.    
  44. End Sub
  45.  
  46.  

Recorre los elementos de la matriz que contiene los números, busca en la tabla de la bd las posibles correspondencias, recorre la selección intentando indentificar el valor del campo con la matricula completa en la cadena resultado de la función 'ProcesarTxt' (en el ejemplo str1). Es decir, algo así:
Código: Text
  1.  
  2. If Instr(1,str1,recordsetMatriculas.Fields(&#34;Matricula&#34;).value) &#62; 0 Then _
  3. MsgBox &#34;Has encontrado la matrícula, enhorabuena tronco...&#34;
  4.  
  5.  

Espero que me haya explicado bien...
Suerte.

Gandalf_malaga7

  • Miembro MUY activo
  • ***
  • Mensajes: 162
    • Ver Perfil
Re: Leer De Un Txt!!!
« Respuesta #20 en: Martes 16 de Marzo de 2004, 15:10 »
0
Gracias Brroz :D ,
me parece buena idea,es que no estaba seguro si tu algoritmo iba a probar todas las posibles cadenas de 4 números pero parece ser que sí,lo único es que si tuviera 2 coches con los mismos números en mi parking ( ya seria mala suerte pero ya sabemos que las leyes de Murphy tambien se aplican a la programación) tendria que buscar otra coincidencia y mostrar las 2 por pantalla para permitir el acceso o no de forma manual.Si lo hay una coincidencia no hay problema,se deja pasar el coche y punto.

Voy a intentar integrarlo y ya te cuento :comp: ,tambien estaría bien tener un algoritmo que paralelamente solo deje las letras del .txt,y que busque de la misma manera en la base de datos las coincidencias,y si las letras coinciden en la misma mátricula en la que coinciden los números ya es seguro nuestro coche,
sería posible hacer esto? :blink: ,

bueno un millón de gracias!!!!!!!!!!!! ;)
...Gandalf El Gris,ese era mi nombre;soy Gandalf El Blanco y en los albores de la tempestad vuelvo a vosotros.

Brroz

  • Miembro de PLATA
  • *****
  • Mensajes: 1058
    • Ver Perfil
Re: Leer De Un Txt!!!
« Respuesta #21 en: Martes 16 de Marzo de 2004, 15:28 »
0
Hola Gandalf_malaga7.

Lo que dices es posible, pero no necesario. Creo que no me expliqué suficientemente bien:

Si la búsqueda en la bd, selecciona dos registros, estás de enhorabuena, busca la matrícula completa que tendrás en cada registro en la cadena con las letras y los números, con toda probabilidad, sólo una coincidirá...

Siguiendo con los ejemplos, supon que str1 contiene la cadena de letras y números, rsMatriculas es el recordset con los registros que has seleccionado y el campo "Matricula" es el campo del recordset que contiene las matriculas en tu bd.
Código: Text
  1.  
  2. .
  3. .
  4. .
  5. rs.Matriculas.MoveFirst
  6. Do until rsMatriculas.EOF
  7.     If Instr(1,str1,rsMatriculas.Fields(&#34;Matricula&#34;).value)) &#62; 0 Then Exit Do
  8.     rsMatriculas.MoveNext
  9. Loop
  10.  
  11. If not rsMatriculas.EOF Then
  12.     MsgBox &#34;La matrícula es &#34; & rsMatriculas.Fields(&#34;Matricula&#34;).value
  13. Else
  14.     MsgBox &#34;La matrícula no se ha encontrado en la db&#34;
  15. End If
  16.  
  17.  

Espero que ahora haya quedado más claro.

Abur.

Gandalf_malaga7

  • Miembro MUY activo
  • ***
  • Mensajes: 162
    • Ver Perfil
Re: Leer De Un Txt!!!
« Respuesta #22 en: Martes 16 de Marzo de 2004, 16:30 »
0
Creo que ya esta claro,perdona por la tardanza pero soy novato por algo,
vamos a ver,tu idea es,coger todas las combinaciones de 4 números que haya en el .txt y meterlas en una matriz.Se busca en la base de datos si coincide alguna de estas combinaciones con los números de las mátriculas que yo tengo guardadas,y una vez encontrada alguna coincidencia,se toma esta mátricula entera (con letras y todo) y con la función que teníamos BuscarCadenaEnArchivo buscamos la mátricula completa en el .txt y si este nos devuelve una posición,es que la ha encontrado y todo perfecto,y si nos devuelve un 0 es uqe no ha encontrado la mátricula perfecta,creo que es esto lo que me estas diciendo :o ,

un último favor,tengo las siguientes funciones:

1)Function BuscarCadenaEnArchivo(ByVal FilePathFileName As String, ByVal Cadena As String, Optional ByVal Desde As Long, Optional ByVal CaseSens As Boolean) As Long

2)Function ProcesarTxt(ByVal InputFile As String) As String
(modificada ya para que solo me devuelva la cadena con los números,sin letras)

si no es mucho pedir me podrias escribir en un mensaje como quedaría el programa completo  :whistling: ,es que tengo claro lo que hace pero no se bien como integrarlo y estoy deseando provarlo porque me parece muy buena idea.Las dos funciones de arriba no hace falta que las escribas,solo cuando las llamas.
Si estas muy liado  :blink:  no te preocupes ya lo intentaré probar yo mas adelante,de todas formas muchas gracias Brroz me estas solucionando una buena papeleta,
un saludo :hola:
...Gandalf El Gris,ese era mi nombre;soy Gandalf El Blanco y en los albores de la tempestad vuelvo a vosotros.

Brroz

  • Miembro de PLATA
  • *****
  • Mensajes: 1058
    • Ver Perfil
Re: Leer De Un Txt!!!
« Respuesta #23 en: Martes 16 de Marzo de 2004, 17:52 »
0
Hola Gandalf_malaga7.

De la primera función 'BuscarCadenaEnArchivo' olvídate, ya que al final quedamos en que no la íbamos a utilizar para nada.

Resumiendo, las funciones/métodos que harán falta serán:

1- ProcesarTxt
Tomando como parámetro de entrada un archivo de texto, devuelve un valor string que contiene números y letras mayúsculas hayados en ese archivo de texto.

2- ExtraerGrupos4Numeros
Toma como entrada el string devuelto de la función anterior, y establece una matriz cuyos elementos son los posibles grupos de cuatro números que se encontraron en el string de entrada.

Aparte de estos dos métodos, es necesario un cuerpo principal del programa que los llame, efectúe la consulta a la base de datos, etc. En los ejemplos el código para este método considerabamos que se encontraba alojado en el evento Click de un CommandButton. Podría quedar algo así:
Código: Text
  1.  
  2. Private Sub Command1_Click()
  3.  
  4.    On Error Resume Next
  5.  
  6.    Dim strOCR As String
  7.    strOCR = ProcesarTxt(&#34;C:&#092;Prueba3.txt&#34;)  
  8.  
  9.    Dim int4Numeros() As Integer
  10.    ExtraerGrupos4Numeros strOCR, int4Numeros
  11.   
  12. 'Aquí presupongo que tienes definidas la correspondiente
  13. 'conexión y comandos a la base de datos. Considero para
  14. 'el ejemplo que cmd1 es un objeto Command válido...
  15.     dim rsMatriculas As Recordset, strSQL As String
  16.     strSQL = &#34;SELECT * FROM TablaMatriculas WHERE Matricula LIKE &#34;
  17.   
  18.     dim lng1 as long
  19.     For lng1 = 1 to ubound(int4Numeros)
  20.       
  21.        cmd1.CommandText = strSQL & &#34;'%&#34; & int4Numeros(lng1) & &#34;%'&#34;
  22.        set rsMatriculas=cmd1.Execute()
  23.       
  24.        If rs.RecordCount &#62; 0 Then rs.Matriculas.MoveFirst
  25.  
  26.        Do until rsMatriculas.EOF
  27.            If Instr(1,strOCR,rsMatriculas.Fields(&#34;Matricula&#34;).value)) &#62; 0 Then Exit Do
  28.            rsMatriculas.MoveNext
  29.        Loop
  30.  
  31.        If not rsMatriculas.EOF Then
  32.            MsgBox &#34;La matrícula es &#34; & rsMatriculas.Fields(&#34;Matricula&#34;).value
  33.            Exit For
  34.        End If
  35.  
  36.    Next lng1
  37.  
  38.    If not rsMatriculas is Nothing Then
  39.           If rsMatriculas.EOF Then _
  40.           MsgBox &#34;La matrícula no se ha encontrado en la db&#34;
  41.    Else
  42.           MsgBox &#34;La matrícula no se ha encontrado en la db&#34;
  43.    End If
  44. .
  45. .
  46. .
  47. End Sub
  48.  
  49.  

Bueno, creo que esto es todo, el resto (¡si es que queda resto!) intenta ponerlo tú de tu parte. Si tienes problemas con la conexión y consulta a la bd, en este mismo foro hay multitud de ejemplos que te pueden servir: utiliza la herramienta de búsqueda.

Chao.

Gandalf_malaga7

  • Miembro MUY activo
  • ***
  • Mensajes: 162
    • Ver Perfil
Re: Leer De Un Txt!!!
« Respuesta #24 en: Martes 16 de Marzo de 2004, 20:37 »
0
Que tal Brroz,estoy aqui integrando el código que me has pasao y todo va bien exepto que creo que el objeto command (cmd1) es sólo utilizable en base de datos ADO y yo estoy usando una DAO  :huh: ,quiere decir esto que no puedo usar el código que me has pasado?,me recomiendas que cambie mi base de datos y la haga en ADO?

Ya lo tengo casi...
...Gandalf El Gris,ese era mi nombre;soy Gandalf El Blanco y en los albores de la tempestad vuelvo a vosotros.