FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Comparar cadenas de caracteres sacadas de un fichero
Estoy intentando procesar un fichero que no lo puedo leer como texto.
La información que me interesa comienza siempre con la misma cadena, 00:F5:02:40:00 en hexadecimal. El código que uso es el siguiente:
EL valor del sStarCross es #0'õ'#2'@'#0 y no hay forma de que en el bucle me cumpla la condición de la comparación bien. No se por donde cogerlo, es la primera vez que tengo que hacer algo así y ahora he visto que el problema está ahí, en como comparo buffer y sStarCross , que no se cumple la condición bien.
__________________
"El aprendizaje potencia la intuición" Yo mismo, en un momento de inspiración. v2.0 |
#2
|
||||
|
||||
Si las variables sStartCross y buffer son de tipo strings, prueba a comparar con la función de windows: lstrcmpi que es equivalente al strcmp del lenguaje C.
Puede que te sirva. |
#3
|
||||
|
||||
El error que me da si lo escribo así:
es "Incompatible types: 'String' and 'PAnsiChar'" sStarCross y Buffer son ambos 'Strings' Me da el mismo error con la orden que me has dado.
__________________
"El aprendizaje potencia la intuición" Yo mismo, en un momento de inspiración. v2.0 |
#4
|
||||
|
||||
No se si me estoy perdiendo algo. Pero lo primero que veo es que estas utilizando el carácter #0, y recordemos que ese carácter se utiliza para marcar el final de una cadena. Por lo tanto cuando haces esto:
Como sStartCross comienza por #0, se considera una cadena vacía, así que en el momento en que el contenido de buffer también comience por #0 la condición se cumplirá, es decir, no se tendrán en cuenta el resto de caracteres. Yo te sugiero que para hacer comprobaciones en las que interviene el carácter #0 utilices funciones como CompareMem, mucho mas rápida, y no te metas a utilizar funciones para el tratamiento de cadenas |
#5
|
||||
|
||||
Cita:
__________________
"El aprendizaje potencia la intuición" Yo mismo, en un momento de inspiración. v2.0 |
#6
|
||||
|
||||
Y si siempre comienza por esa cadena ¿por qué no te lo saltas y empiezas en la posición siguiente?
¿Puedes ponernos un trocito del fichero para probar?
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código Únete al grupo Teaming clubdelphi | Colabora mediante Paypal Última edición por Casimiro Notevi fecha: 21-12-2006 a las 14:21:00. |
#7
|
||||
|
||||
siempre puedes escribir una pequenia funcion propia de comparacion, con un simple ciclo dentro que compare elemento por elemento y que te devuelva un true en caso de ser iguales.
Aunque creo haber visto dentro de delphi una funcion similar pero no recuerdo donde.
__________________
[Crandel] Última edición por Crandel fecha: 21-12-2006 a las 14:28:02. |
#8
|
||||
|
||||
Casimiro:
Se que podría saltarmelo y buscar la cadena 'F5:02:40:00' directamente, pero eso no resolvería mi problema, solo lo parchearía. Y si en un momento dado tengo que pelearme con cadenas cuyo identificador comienza por '00' tendré que aprender, y ya que el tema me pilla pez, mejor aprenderlo sin vicios ni malas costumbres Aqui un trozo: Código:
00000000:00 00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .. 00000010:20 20 20 00 32 34 32 31 31 00 20 20 20 20 20 20 .24211. 00000020:20 20 00 4e 45 57 20 48 4f 4c 4c 41 4e 44 00 20 .NEW HOLLAND. 00000030:20 20 20 20 20 20 20 00 33 33 33 20 54 52 41 43 .333 TRAC 00000040:54 4f 52 00 20 20 20 20 20 20 20 20 20 20 20 20 TOR. 00000050:20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 00000060:20 20 20 20 20 20 20 20 20 20 00 31 39 37 35 00 .1975. 00000070:31 39 38 34 00 f5 02 40 01 00 00 00 00 00 20 20 1984.õ.@...... 00000080:20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 00 . 00000090:32 33 39 38 33 00 20 20 20 20 20 20 20 20 00 46 23983. .F 000000a0:4f 52 44 00 20 20 20 20 20 20 20 20 20 20 20 20 ORD. 000000b0:20 20 20 00 43 4f 52 54 49 4e 41 20 49 56 20 31 .CORTINA IV 1 000000c0:2c 33 20 28 4c 46 50 2d 54 4f 20 52 45 50 4c 41 ,3 (LFP-TO REPLA 000000d0:43 45 20 4c 55 43 41 53 20 4f 4e 4c 59 29 00 20 CE LUCAS ONLY). 000000e0:20 20 20 20 20 20 00 31 39 37 36 00 31 39 37 39 .1976.1979 000000f0:00 f5 02 40 01 00 00 00 00 00 20 20 20 20 20 20 .õ.@...... 00000100:20 20 20 20 20 20 20 20 20 20 20 00 32 33 39 38 .2398 Esa es la opción que estaba barajando y que parametrizandola me dará toda la funcionalidad que busco.
__________________
"El aprendizaje potencia la intuición" Yo mismo, en un momento de inspiración. v2.0 |
#9
|
||||
|
||||
Una primera aproximacion sería algo como esto:
La función buscar, nos devuelve la posición de la cadena que buscamos, o -1 si no la encuentra. La única desventaja es que cargamos todo el archivo en memoria y si el archivo es muy grande (un par de decenas de megas) puede resultar un problema. |
#10
|
||||
|
||||
Ostias! Eso me llevará un rato leerlo, comprenderlo y asimilarlo. Asi que aprovecho para hacer una pausita, ir al gimnasio, comer y luego con fuerzas renovadas me enfrentaré a esto.
Gracias Seoane y a todos los demás. PD:Soluciones mas sencillas también se aceptan
__________________
"El aprendizaje potencia la intuición" Yo mismo, en un momento de inspiración. v2.0 |
#11
|
||||
|
||||
Cita:
|
#12
|
||||
|
||||
Cita:
Por cierto, Papulo, ¿eso es una tabla de algún tipo de base de datos que quizás sea pública su estructura, no? |
#13
|
||||
|
||||
Cita:
__________________
[Crandel] |
#14
|
||||
|
||||
Total, mucho tendría que estar en el gimnasio para ponerme como el amigo Xander que aquí parece un croasant (sin animo de ofender)
Aqui una fotos de un crosant para comparar http://images.google.com/images?hl=e...-8&sa=N&tab=wi |
#15
|
||||
|
||||
Cita:
No os imaginais lo descoordinadas que son las grandes empresas, BOSCH, VALEO y esta gente. A veces da la sensación de que ves ciclopes dando palos de ciego. A todos los demás, el ejercicio viene de fábula, yo no estoy tan cachas como el amigo bombero, pero estoy cuadradete tambien, y a parte hago esgrima y juego a balonmano.
__________________
"El aprendizaje potencia la intuición" Yo mismo, en un momento de inspiración. v2.0 |
#16
|
||||
|
||||
Si son registros de longitud fija lo tienes sencillo.
|
#17
|
||||
|
||||
Cita:
¿Me lo expliquen? ¿Que quieres decir con eso?
__________________
"El aprendizaje potencia la intuición" Yo mismo, en un momento de inspiración. v2.0 |
#18
|
||||
|
||||
que si el fichero es de una forma parecida a esta, tiene una cabecera y luego los registros en sí:
xx bytes -> cabecera de longitud la que sea (puede no tener cabecera) 64 bytes -> datos de un registro 64 bytes -> datos de otro registro 64 bytes -> datos de un registro más 64 bytes -> etc... cada uno de esos 64 bytes (es un ejemplo), pueden estar subdivididos en los campos de la tabla: 08 bytes -> código 32 bytes -> descripción (es el dato que te interesa, creo) 08 bytes -> precio xx bytes -> etc... Si este fuese el caso tan sólo tendrías que "saltar" la cabecera y luego leer/saltar a intervalos fijos para los datos que te interesan de cada registro. Aunque seguro que esta posibilidad ya lo habrás comprobado, era sólo por dar una idea más. |
#19
|
||||
|
||||
Negativo, casimiro, no es de longitud fija.Si lo fuera sería un chollete.
__________________
"El aprendizaje potencia la intuición" Yo mismo, en un momento de inspiración. v2.0 |
#20
|
||||
|
||||
al menos podrían decirte qué tipo de archivo es
|
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Comparar dos cadenas de texto | creus | Varios | 5 | 06-03-2009 00:22:13 |
Obtener un fichero adjunto a un nodo de un fichero XML | muntasil | Internet | 0 | 18-07-2006 12:57:57 |
Uso de cadenas | zvf | OOP | 4 | 05-04-2006 00:55:47 |
Comparar caracteres tecleados con los de una cadena | Calculador | Varios | 1 | 16-01-2005 18:36:35 |
if ... in [] con cadenas???? | neon | Varios | 3 | 10-12-2004 13:15:39 |
|