|
Página 1 de 2
|
Problema Analizando Caracteres...
Autor |
Mensaje |
Pablo-GNU
Aprendiz
Registrado: Enero 2010
Mensajes: 57
Edad: 37
|
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.
|
#1 Martes, 08 Marzo 2011, 16:09 |
|
|
jsbsan
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4175
Edad: 51 Ubicación: dos hermanas, sevilla
|
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
última edición por jsbsan el Martes, 08 Marzo 2011, 16:21; editado 1 vez
|
#2 Martes, 08 Marzo 2011, 16:18 |
|
|
Pablo-GNU
Aprendiz
Registrado: Enero 2010
Mensajes: 57
Edad: 37
|
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   eso que es?
Saludos!
|
#3 Martes, 08 Marzo 2011, 16:26 |
|
|
Pablo-GNU
Aprendiz
Registrado: Enero 2010
Mensajes: 57
Edad: 37
|
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?
|
#4 Martes, 08 Marzo 2011, 16:44 |
|
|
Pablo-GNU
Aprendiz
Registrado: Enero 2010
Mensajes: 57
Edad: 37
|
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
|
#5 Martes, 08 Marzo 2011, 17:10 |
|
|
soplo
Analista Programador
Registrado: Septiembre 2009
Mensajes: 843
Edad: 44
|
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
|
#6 Martes, 08 Marzo 2011, 17:51 |
|
|
Pablo-GNU
Aprendiz
Registrado: Enero 2010
Mensajes: 57
Edad: 37
|
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
http://img708.imageshack.us/i/pantallazoyln.png/
última edición por Pablo-GNU el Martes, 08 Marzo 2011, 18:07; editado 1 vez
|
#7 Martes, 08 Marzo 2011, 18:06 |
|
|
soplo
Analista Programador
Registrado: Septiembre 2009
Mensajes: 843
Edad: 44
|
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
|
#8 Martes, 08 Marzo 2011, 18:38 |
|
|
Pablo-GNU
Aprendiz
Registrado: Enero 2010
Mensajes: 57
Edad: 37
|
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.
|
#9 Miercoles, 09 Marzo 2011, 09:55 |
|
|
soplo
Analista Programador
Registrado: Septiembre 2009
Mensajes: 843
Edad: 44
|
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))
|
#10 Miercoles, 09 Marzo 2011, 14:28 |
|
|
|
Temas parecidos
Temas parecidos
|
Página 1 de 2
|
Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado Usuarios registrados conectados: Ninguno
|
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
|
|
|
|
|