https://foro.gambas-es.org/viewtopic.php?f=1&t=1474
-----------------------------------
Pablo-GNU
Martes, 08 Marzo 2011, 16:09

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.


-----------------------------------
jsbsan
Martes, 08 Marzo 2011, 16:18

Re: Problema Analizando Caracteres...
-----------------------------------
Se puede hacer de varias formas:

- lees la linea completa[url=http://gambasdoc.org/help/lang/lineinput?es&view](line input), y la trozeas con [url=http://gambasdoc.org/help/lang/split?es&view]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


-----------------------------------
Pablo-GNU
Martes, 08 Marzo 2011, 16:26

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
Martes, 08 Marzo 2011, 16:44

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
Martes, 08 Marzo 2011, 17:10

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


-----------------------------------
soplo
Martes, 08 Marzo 2011, 17:51

Re: Problema Analizando Caracteres...
-----------------------------------
Hola Pablo

[b]La lectura del fichero[/b]
[quote]hFile = OPEN path FOR READ

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

hFile.Close [/quote]
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.

[b]Obtención de registros[/b]
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")

[b]buscar la línea que quieres. [/b]
Imagino que la línea que quieres está en textbox.text
El primer elemento de linas es 0 y el último es lineas.max
[code linenumbers=false syntax=gambas]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[/code]

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
[code linenumbers=false syntax=gambas]Variable=Lineas.join 'las vuelves a unir en un solo string que contiene todas las líneas
file.save(fichero,Lineas)[/code] 'pisar el viejo con el nuevo

[b]La rutina de hace el cambio[/b] podria ser la siguiente
private function CambiarValor(Linea as string) as string
[code linenumbers=false syntax=gambas]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
[/code]

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


-----------------------------------
Pablo-GNU
Martes, 08 Marzo 2011, 18:06

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

[img]http://img708.imageshack.us/i/pantallazoyln.png/[/img]
http://img708.imageshack.us/i/pantallazoyln.png/


-----------------------------------
soplo
Martes, 08 Marzo 2011, 18:38

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


-----------------------------------
Pablo-GNU
Miercoles, 09 Marzo 2011, 09:55

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.

[img]http://foro.gambas-es.org/files/images/549/variablemodificada.png[/img]


-----------------------------------
soplo
Miercoles, 09 Marzo 2011, 14:28

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


-----------------------------------
Pablo-GNU
Miercoles, 09 Marzo 2011, 17:37

Re: Problema Analizando Caracteres...
-----------------------------------
Las variables en el mio son de otra manera.. pero esta es lo que yo he sacado

variable2[Cuenta] = Left(linea, (PosInicioValor - 1)) & TextBox2.Text

y con esta manera no me varia nada mas que el numero despues del igual


