A vueltas con el FileWriteLine
A vueltas con el FileWriteLine
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!
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!
- Ximorro
- Profesional del Autoit
- Mensajes: 1500
- Registrado: 10 Jul 2009, 12:35
- Ubicación: Castellón, España
Re: A vueltas con el FileWriteLine
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.
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.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
- Chefito
- Profesional del Autoit
- Mensajes: 2035
- Registrado: 21 Feb 2008, 18:42
- Ubicación: Albacete/Cuenca (España)
Re: A vueltas con el FileWriteLine
Ximorro tiene razón en casi todo . 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 . 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 .
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.
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 . 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 .
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)
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.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
- Ximorro
- Profesional del Autoit
- Mensajes: 1500
- Registrado: 10 Jul 2009, 12:35
- Ubicación: Castellón, España
Re: A vueltas con el FileWriteLine
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.
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.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Re: A vueltas con el FileWriteLine
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. Pero con las soluciones que me habéis dicho, es más que solucionable.
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
Muchas Gracias!!
La verdad es que algo tan completo como autoit no pensé que no se pudiera abrir fiecheros de lectura y escritura. Pero con las soluciones que me habéis dicho, es más que solucionable.
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
Muchas Gracias!!
- Ximorro
- Profesional del Autoit
- Mensajes: 1500
- Registrado: 10 Jul 2009, 12:35
- Ubicación: Castellón, España
Re: A vueltas con el FileWriteLine
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
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
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
- BasicOs
- Site Admin
- Mensajes: 2091
- Registrado: 21 Nov 2006, 19:24
- Ubicación: El Internet - (Canarias, España)
- Contactar:
Re: A vueltas con el FileWriteLine
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:)
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:)
- Ximorro
- Profesional del Autoit
- Mensajes: 1500
- Registrado: 10 Jul 2009, 12:35
- Ubicación: Castellón, España
Re: A vueltas con el FileWriteLine
¡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...
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...
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)