Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 2
Ir a la página 1, 2  Siguiente
 
Problema Analizando Caracteres...
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Problema Analizando Caracteres... 
 
Hola  a todos, tengo un problema con la analizacion de una cadena de caracteres.

El tema viene que... estoy leyendo un fichero con una serie de variables que quiero modificar...

DIM hFile AS File
DIM path, espacio1, espacio2, espacio3 AS String
DIM i AS Integer

path = "/home/pablo/Escritorio/numremota.cfg"
hFile = OPEN path FOR READ

WHILE NOT Eof(hFile)
  INPUT #hFile, espacio1, espacio2, espacio3
WEND

hFile.Close

END

Cuando yo leo ese fichero, si la frase esta escrita de la siguiente manera:

VARIABLE = VALOR

en espacio1 obtengo VARIABLE
en espacio2 obtengo =
en espacio3 obtengo VALOR

tambien se da el caso si

VARIABLE[tabulacion]=[tabulacion]valor

el problema viene de que.. este fichero la persona que lo escribe no lo hace correctamente, entonces... hay variables escritas asi...

VARIABLE         [tabulacion][tabulacion]= valor

Claro... mi pregunta es.. como puedo yo analizar todo esto sin obtener errores... porque ya si es este ultimo caso lo que estoy leyendo es nulo

Quedaria:

espacio1 = VARIABLE
espacio2 = (nada)
espacio3 = (nada)

Desde ya muchas gracias.
 



 
Pablo-GNU - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Analizando Caracteres... 
 
Se puede hacer de varias formas:

- lees la linea completa(line input), y la trozeas con split sabiendo cual es el separador de cada palabra (el tabulador, la coma)

- O con input lee cada variable de una en una, en vez de las 3 a la vez. Para cuendo aparezca el valor raro o el final de fichero no esperado, te des cuente y actues poniendo por ejemplo los valores restantes a cero, o sacando un mensaje de error.


Saludos
 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
última edición por jsbsan el Martes, 08 Marzo 2011, 16:21; editado 1 vez 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Analizando Caracteres... 
 
Lo he intentado como dices, pero no se como es la representacion del tab, \t?

Luego otra cosa analizando con line input he sacado que el valor es &nbsp eso que es?

Saludos!
 



 
Pablo-GNU - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Analizando Caracteres... 
 
Bueno con esto soy capaz de sacar el contenido a un textbox...

DIM hFile AS File
DIM path, espacio1 AS String

path = "/home/pablo/Escritorio/numremota.cfg"
hFile = OPEN path FOR READ

WHILE NOT Eof(hFile)
  LINE INPUT #hFile, espacio1
  IF InStr(espacio1, TextBox1.Text) THEN
    TextBox2.Text = espacio1
  ENDIF
WEND

hFile.Close

ahora supongamos que yo modifico ese valor, como puedo ser capaz de cambiarlo en el fichero y guardarlo?
 



 
Pablo-GNU - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Analizando Caracteres... 
 
He probado lo siguiente:

DIM hFile AS File
DIM path, espacio1 AS String

path = "/home/pablo/Escritorio/numremota.cfg"
hFile = OPEN path FOR READ WRITE

WHILE NOT Eof(hFile)
  LINE INPUT #hFile, espacio1
  IF InStr(espacio1, "IEC-101.Link.Debug") THEN
   PRINT #hFile, "IEC-101.Link.Debug = 0"
  ENDIF
WEND

hFile.Close

Y descubro que me cambia el fichero de esto:

IP.Link.Debug           = 1
IP.Link.RepeatPollTOut  = 15000
IP.Link.RepeatPollRetry = 3

A esto:

IEC-101.Link.Debug           = 1
IEC-101.Link.Debug = 0
TOut  = 15000
IEC-101.Link.RepeatPollRetry = 3

De verdad que no se como hacerlo :S
 



 
Pablo-GNU - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Analizando Caracteres... 
 
Hola Pablo

La lectura del fichero
Citar:
hFile = OPEN path FOR READ

WHILE NOT Eof(hFile)
INPUT #hFile, espacio1, espacio2, espacio3
WEND

hFile.Close

Te sugiero que leas el archivo de esta forma que me parece mas adecuada para tu caso
variable=file.load(fichero) 'todo el fichero queda en una variable string
o bien esta otra
input #hFile,variable,lof(hFile) 'otra forma de meter todo el archivo en una variable string de un solo golpe.

Obtención de registros
Ahora que tienes todo tu fichero en un solo string el siguiente paso es obtener los registros. Supongamos que cada registro acaba en LF (salto de linea \n)

Dim Lineas as NEW string[] ' cada string de este array será una línea de tu fichero
Lineas=split(variable,"\\n")

buscar la línea que quieres.
Imagino que la línea que quieres está en textbox.text
El primer elemento de linas es 0 y el último es lineas.max
dim Contador as integer, Pos as integer
For contador=0 to Lineas.Max
   Pos=instr(Lineas[Contador],textbox.text)
   if Pos>0 'si es mayor que cero es que esta linea es la que quieres. Pos es la posición en la que está tu variable
      Lineas[Contador]=CambiarValor(Lineas[Contador]) 'llamas a una funcion que te haga el cambio.
      break
   endif
next


Una vez hayas hecho todos los cambios en ese archivo deberías volver a escribirlo. Sustituyes el archivo anterior por el nuevo con los cambios
Variable=Lineas.join 'las vuelves a unir en un solo string que contiene todas las líneas
file.save(fichero,Lineas)
'pisar el viejo con el nuevo

La rutina de hace el cambio podria ser la siguiente
private function CambiarValor(Linea as string) as string
Dim PosInicioValor as integer, Contador=0
'primero buscar el =
PosInicioValor=instring(linea,"=") 'lo que buscas estará a partir de ahí
inc PosInicioValor 'ponerme en la posicion siguiente
do while true 'un bucle infinito. Saldremos cuando encontremos la posición del texto a cambiar
   if instr(" \\t",mid(Linea,PosInicioValor,1))>0 'comparo una lista de caracteres a ignorar con un caracter de linea
      inc PosInicioValor 'me voy al caracter siguiente
   else
      break 'el caracter no está en la lista de los caracteres a ignorar. Debe ser el primer caracter del string que buscabas
   endif
loop
'En PosInicioValor tienes el principio del texto a reemplazar por un valor que tengas en textbox2.text
'En mid(Linea,PosInicioValor) tienes el contenido del texto a sustituir
Lineas[Contador]=replace(linea,mid(linea,PosInicioValor),textbox2.text)
return linea
end
 


Si haces copypastes sin mas no te funcionará porque he tratado de dejarte la idea pero partes de ese código deberían estar en funciones separadas, pero ya sabes como se hace. Fíjate que es mucho mas sentillo meter todo en un string y luego dividir ese string en lineas. Fíjate que en vez de modificar el archivo lo que hago es hacer los cambios en el string y luego piso el fichero viejo con el nuevo que incluye los cambios y fíjate que para hacer el cambio en un string lo que intenté es encontrar el string viejo a cambiar para poder hacer un replace.

Si tienes duda sobre alguna parte de este código no dejes de preguntar je je je

Un saludo
 



 
última edición por soplo el Martes, 08 Marzo 2011, 17:57; editado 3 veces 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Analizando Caracteres... 
 
Hola y ante todo muchisimas gracias...

solamente he probado la seccion de codigo encargada de buscar la linea en cuestion pero me he encontrado el siguiente problema, si tengo esa linea repetida, sin comentar y otra comentada para que la aplicacion en cuestion no la utilice, el codigo aun asi lo interpreta como 2 lineas... te pego un adjunto...

Te lo vuelvo a decir... desde ya muchas muchas gracias

pantallazoyln
http://img708.imageshack.us/i/pantallazoyln.png/
 



 
última edición por Pablo-GNU el Martes, 08 Marzo 2011, 18:07; editado 1 vez 
Pablo-GNU - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Analizando Caracteres... 
 
Hombre es que si tienes una linea comentada utilizarás un caracter para indicar que es comentada. Imaginemos que sea el #.
 
Pues tu haces un instr(linea,"#" y si eso es mayor que cero es que esa linea es comentada y pasas a otra en el bucle. Tu tienes que encontrar la línea donde quieres hacer el cambio. En el bucle donde buscas la linea incluye esa posibilidad
 



 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Analizando Caracteres... 
 
Hola! He solucionado el tema de los comentarios, de momento no he posteado el codigo porque estoy debugeando todo, pero me he encontrado con un problema con respecto a lo que decias... mira...

Si yo busco la variable "IEC-101.RTU.0.Addr" esta me la encuentra y me dice que su valor es "10", si cambio ese valor a "01", la sentencia de Replace busca "10" en toda la linea y cuando la encuentra lo que hace es modificarme eso por 01, dejandome el resultado final asi IEC-011.RTU.0.Addr = 01.

Te adjunto una foto del ejemplo.

variablemodificada
 



 
Pablo-GNU - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Analizando Caracteres... 
 
pues como tienes la posición de inicio de los datos haz el replace solo en esa parte del string.

Aquí haces el replace en linea.
Lineas[Contador]=replace(linea,mid(linea,PosInicioValor),textbox2.text)
Si se da el caso que puedes sustituir caracteres inadecuados con ese replace en vez de hacer el replace en toda la linea hazlo solo en la parte que corresponde. Te recuerdo que PosInicioValor es el comienzo del dato.
left(Lineas[Contador],PosInicioVAlor-1) es la parte anterior a posinicio valor. Donde no tienes que cambiar nada.
mid(Lineas[Contador],PosinicioValor) es la parte donde tienes que hacer el cambio

Así que la solución será
lineas[Contador]=Left(Lineas[Contador],PosInicioValor-1) & replace/mid(Lineas[Contador],PosInicioValor))
 



 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Convertir Juego De Caracteres UTF-8 A Jueg... jsbsan General 15 Lunes, 10 Enero 2011, 19:21 Ver último mensaje
soplo
No hay nuevos mensajes Caracteres De Url [SOLUCIONADO] shordi General 4 Lunes, 23 May 2016, 22:28 Ver último mensaje
vuott
No hay nuevos mensajes Problema Para Contar Caracteres Con Tilde ... v3ctor General 5 Miercoles, 12 Octobre 2016, 22:07 Ver último mensaje
tincho
No hay nuevos mensajes Caracteres Especiales Shell HTML y CSS 4 Lunes, 04 May 2020, 15:25 Ver último mensaje
Shell
 

Publicar nuevo tema  Responder al tema  Página 1 de 2
Ir a la página 1, 2  Siguiente

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron