Página 1 de 1

A vueltas con el FileWriteLine

Publicado: 24 Nov 2009, 16:59
por chechu
Hola a todos

Me está costando este programa, os cuento.

Tengo un fichero.txt con la siguiente estructura

campo1;campo2;campo3;campo4
...
campo1n;campo2n;campo3n;campo4n.

Lo que pretendo es recorrer las filas con FileReadLine y cada campo de esa fila con un array gracias a stringsplit separado por ";"

Hasta ahí todo bien lo recorre sin problemas. Ahora bien, el problema me lo encuentro en que después de recorrer cada fila, quiero q me escriba a la derecha del campo 4 la frase "Línea revisada"

Este es el código que tengo hasta el momento;


$archivo = FileOpen("fichero.txt", 0)
; Revisa si el archivo está listo para abrir
If $archivo = -1 Then
MsgBox(0, "Error", "El archivo con las provincias no se puede abrir.")
Exit
EndIf

While 1
$line = FileReadLine($archivo)

If @error = -1 then ExitLoop
$lineaentera=stringsplit ($line, ";")

For $i=1 to 4

MsgBox(0, "el fichero contiene", $lineaentera[$i], 2) ;recorre cada campo del fichero y lo muestra cada 2 segundos

next
FileWriteLine($archivo, "Línea revisada")

Wend
FileClose($archivo)

Sí, el FileOpen está puesto a 0 en vez de a 1 porque si lo pongo a 1 falla el scrip. Es como si no leyera nada, y me da un error en el array.

¿Podéis ayudarme? Desconozco como puedo hacer esto...

Desde ya muchas gracias por vuestra ayuda.
Un saludo!

Re: A vueltas con el FileWriteLine

Publicado: 25 Nov 2009, 13:14
por Ximorro
Me temo que con AutoIt no puedes tener un archivo abierto en modo lectura y escritura a la vez, si he entendido bien la ayuda. Además hasta donde sé, también según la ayuda de AutoIT, no se puede escribir insertando en medio del fichero, o escribes al final o machacas lo que ya hay...

Lo que tendrás que hacer es abrir el archivo origen en modo lectura, y crear otro nuevo en modo escritura donde vas copiando lo mismo más el "Línea revisada".

Al acabar el proceso puedes borrar el primero (o cambiarlo a .BAK sería buena idea) y cambiar de nombre el segundo para que sustituya al original.

Re: A vueltas con el FileWriteLine

Publicado: 26 Nov 2009, 02:36
por Chefito
Ximorro tiene razón en casi todo :smt002 . Cuando se abre un archivo, o es en modo lectura o escritura, pero no juntos.
Lo que pasa que cuando se abre en el modo 2, cuando se cierra ese mismo archivo, se sobreescribe. Por esta causa no es necesario crear un archivo auxiliar para hacer estas cosas.
Bueno, pues lo que hay que hacer es como siempre en estos casos en programación :smt005 . Se abre el archivo en modo lectura, se coge el texto como quieras y se trata. Una vez tratado se va metiendo en una variable global con todo el texto ya tratado. Cuando acabas de hacer esto, cierras el archivo.
Inmediatamente después lo abres en modo escritura (el mismo archivo) para escribir lo que contiene la variable global antes mencionada, la que tiene ya todo el texto tratado y listo para ser guardado. Lo cierras de nuevo y listo. Ya tienes tu script :smt023 .

Código: Seleccionar todo

$archivo = FileOpen("fichero.txt", 0)
; Revisa si el archivo está listo para abrir
If $archivo = -1 Then
	MsgBox(0, "Error", "El archivo con las provincias no se puede abrir.")
	Exit
EndIf
Global $textoCompleto=""
While 1
	$line = FileReadLine($archivo)
	If @error = -1 then ExitLoop
	$lineaentera=stringsplit ($line, ";")
	For $i=1 to 4
		MsgBox(0, "el fichero contiene", $lineaentera[$i], 2) ;recorre cada campo del fichero y lo muestra cada 2 segundos
	next
	$textoCompleto=$textoCompleto & $line & " Línea revisada" & @CRLF
Wend
FileClose($archivo)
$archivo = FileOpen("fichero.txt", 2)
FileWrite($archivo,$textoCompleto)
FileClose($archivo)
Por supuesto hay otras formas de tratar el texto (Ejemplo EditRitch), pero por lo que veo tu estructura es al estilo base de datos (campos y registros). Si es poca cosa puedes tratar el texto así, pero si son muchísimos registros (filas) deberías tratarlo como una base de datos.
Razones de esto: Es mucho más fácil de tratar, mucho más rápido, y con muchas más posibilidades.

Hace años traté base de datos de texto (son ficheros de texto al estilo tuyo, con un separador entre campos que en tu caso es el punto y coma), pero que yo recuerde solo se podían tratar en modo lectura. Tendrías que mirarlo.

Saludos.

Re: A vueltas con el FileWriteLine

Publicado: 26 Nov 2009, 09:47
por Ximorro
Es otra opción, pero prácticamente hablamos de lo mismo. En mi caso los datos temporales van a un archivo, en tu caso a un String.

Supongo que la elección depende del tamaño del archivo original, si son muchas líneas yo suelo preferir ir pasándolo a un archivo.
Por eficiencia será parecido, al escribir en el String es muchísimo más rápido, pero es que eso luego hay que escribirlo en el archivo, cosa que vas haciendo poco a poco en el primer método, con lo que estamos prácticamente igual. Al final es cuestión de gustos, porque de todas maneras si el archivo fuera gigantesto lo adecuado será pasarse a otras soluciones, como dice Chefito lo mejor es una base de datos.

Si se pudiera escribir en medio del archivo sería más fácil usarlo como base de datos (teniendo siempre los campos de tamaño fijo, en ese caso no harían falta separadores), pero como eso no es posible...

En AutoIt hay integrada una base de datos, no la he manejado nunca pero para cosas sencillas como esta puede irte muy bien. Si quieres cosas más complicadas se puede enlazar MySQL y creo que también vi una UDF par Postgres.

Y como solución alternativa, aunque personalmente me decantaría por la BD, siempre puedes usar Excel, con AutoIT ya viene una UDF de "Excel Management". Insertar el dato "Línea revisada" y cambiar datos (o incluso borrar/insertar líneas) será fácil con eso. Esto sería una solución intermedia entre manejar el fichero a pelo y montarse una BD.

Re: A vueltas con el FileWriteLine

Publicado: 26 Nov 2009, 18:08
por chechu
Bueno muchas gracias por vuestras respuestas. Sabéis mucho de esto.

La verdad es que algo tan completo como autoit no pensé que no se pudiera abrir fiecheros de lectura y escritura. :smt017 Pero con las soluciones que me habéis dicho, es más que solucionable. :smt005

Para vuestra información, no son archivos grandes. Tiene como mucho 2000 líneas por lo que cualquiera de las soluciones propuestas me viene perfecta.

Da gusto tratar con gente como vosotros :smt003
Muchas Gracias!! :smt006

Re: A vueltas con el FileWriteLine

Publicado: 27 Nov 2009, 11:00
por Ximorro
De nada hombre, para eso estamos.

Coincido contigo en que al tratamiento de ficheros le faltan algunas cosas. Lo de lectura/escritura a la vez es una, otra que me sorprende mucho es que no se pueda escribir en medio, sobreescribiendo, claro, que insertar sí sería más peliagudo...

Ya veremos la próxima versión de AutoIt :smt002

Re: A vueltas con el FileWriteLine

Publicado: 20 Dic 2009, 19:34
por BasicOs
Ahora es posible leer de ficheros abiertos para escritura.
Changed: It is now possible to read from files opened for writing.
Hay algunos cambios más...: no paran de codificar del equipo de developers.

Ver http://www.autoitscript.com/autoit3/docs/history.htm
http://www.autoitscript.com/autoit3/doc ... hanges.htm
http://www.autoitscript.com/autoit3/downloads.shtml

Salu2:)

Re: A vueltas con el FileWriteLine

Publicado: 21 Dic 2009, 10:37
por Ximorro
¡SÍ! Y no sólo eso, también se puede acceder al archivo por medio, con lo que se podrá sobreescribir algunos bytes/caracteres sin tener que reescribir el archivo entero:
Added #135: FileSetPos(), FileGetPos() functions for moving the file pointer around.

Lástima que no hayan ampliado los selectores de archivo (FileOpenDialog y compañía) para hacerlos más controlables...