Acciones sobre archivos de texto. [Batch]

Iniciado por leogtz, 24 Enero 2009, 00:30 AM

0 Miembros y 1 Visitante están viendo este tema.

Eleкtro

#310
@ServH

Muestra el código que llevas hecho por ti mismo, aquí no se hacen tareas.

Te muestro un ejemplo para iterar el log y asignar el "nombre" a la variable de FOR:

Código (dos) [Seleccionar]
For /F "UseBackQ Tokens=1,* Delims= " %%a In ("Archivo.log") Do (Echo %%~b)

Luego, solo tendrías que renombrar los archivos utilizando dicha variable para asignar el nuevo nombre del archivo jpeg.

Saludos








ServH

Hola Elektro.

Pues no tengo nada más que el pseudocódigo ya que voy probando módulos para que me hagan pequeñas funciones. (Estoy empezando con este lenguaje)

Ahora te pondré una muestra.

Lectura del archivo.

filename   name   email   comment   twitter   phone
PHOTO_1   maria            
PHOTO_6   paco         
PHOTO_7   juan            
         
En un primer lugar lo que quiero que haga el bat es leer este .txt y guardar en una variable el nombre del fichero var1=PHOTO1 y otra variable con el nombre var=maria
Pero estas variables quiero que guarden relación (No se como explicarlo).

Después el .bat hará una lectura de los archivos y cuando encuentre PHOTO1 que es = a var1 lo cambie por var2.

Se podría antes de ejecutar nada hacer un tratamiento del log quedando así.
PHOTO_1   maria            
PHOTO_6   paco         
PHOTO_7   juan

P:D No pido el código hecho, solo quiero entender que tengo que hacer y solucionar las cosas en las que estoy fallando.

Un saludo. y gracias.         

Eleкtro

#312
Cita de: ServH en 10 Marzo 2015, 14:28 PMP:D No pido el código hecho, solo quiero entender que tengo que hacer y solucionar las cosas en las que estoy fallando.

Ok, pues te explico, el log consiste en dos "argumentos" (o Tokens), el primero sería el nombre de la imagen (PHOTO_1), y el segundo sería el nombre de la persona (María), pues, solo tienes que modificar el parámetro "Tokens" de un For /F (cómo el que te mostré antes), para que tome esos dos argumentos por separado, usando cómo deliminator de argumento el caracter "espacio", de esa forma almacenarás en la variable %%a el nombre de la imagen, y en la variable %%b el nombre de la persona, obteniendo esa "relación" que quieres.

Lo que acabo de comentar ya lo hace el For que mostré arriba, pero si quieres entenderlo mejor, lee aquí:
For /f - Loop through text | Windows CMD | SS64.com

Saludos








ServH

Hola Elektro.

Primero que nada agradecerte la ayuda desinteresada, me ha sido de utilidad entender mejor que es lo que necesita el programa.

Y en segundo lugar, y observando que tienes experiencia en este lenguaje, ¿Crees que es la manera más optima de realizar esto?

Muchas gracias por el tutorial.

Un saludo.

Eleкtro

#314
Cita de: ServH en 11 Marzo 2015, 09:26 AM¿Crees que es la manera más optima de realizar esto?

No, Batch es una herramienta limitada, está diseñada y orientada a la automatización de tareas simples, los resultados y la eficiencia de cualquier otro lenguaje siempre será más óptimo que Batch, sin excepción alguna.

Sobre el problema que tienes, en parte ese texto que has mostrado se podría considerar un archivo CSV delimitado por espacios, y digo en parte, porque no se si alguno de los campos de esa tabla contiene un "espacio" (ej: 'María del monte'), entonces el algoritmo que uses para delimitar los campos basándose en ese "espacio" delimitador no servirá, y será mucho más complejo, porque si la cantidad de espacios es desconocida... no se cómo vas a reconocer un nombre a menos que utilices una base de datos de nombres, jaja.

Por otro lado, la tarea no requiere más que la utilización de un lenguaje simple cómo es Batch (suponiendo que no haya más espacios adicionales), pero óptimo no es que sea.

En fin, no me enrollo más, lee esta respuesta para hallar una solución mucho más eficiente que Batch:
http://foro.elhacker.net/programacion_general/programa_de_busqueda_con_archivo_csv-t431563.0.html;msg2001628#msg2001628

PD: Ese mismo Snippet que desarrollé en VB.Net te debería servir, pero cambiando el delimitador por un espacio o tabulación o lo que uses, claro está.

PD2: Cómo explico en ese comentario, cualquier otro lenguaje sirve, cómo Python, Ruby, C/C++, Java, etc, la resolución del problema es practicamente la misma en cualquier lenguaje, que consiste en generar un búcle que lea linea por linea, solo que unos lenguajes te lo ponen más fácil que otros, y a partir de ahí la elaboración del algoritmo para hacerlo menos o más sofisticado es cosa tuya.

Saludos!








ServH

Buenísima la respuesta.

Pero estoy un poco "atado" por la gente de "arriba" jaja, voy a intentar convencerlos de que este sistema no es óptimo por que ahora mismo te iba a escribir por el mismo problema.

¿Que pasa si tiene un nombre compuesto?, ya está el lío montado, no me sirve.

En resumen, y por si tienes una idea mejor que la mía, la situación que se me ha planteado es esta.

Tenemos un software que toma una fotografía, pero las opciones de este programa solo nos permite guardarlas con un nombre y un sufijo EJ: PHOTO_1

Después al usuario le pide un nombre, que este se guarda para usarlo en el campo EMAIL (Algo que no entiendo, por que lo ha desarrollado así)

Y la necesidad era simplificar el proceso de renombrar las fotos, para no tener a una persona aburrida haciendo esto y que fuera con un único clic haciendo uso del log.

Eleкtro

@ServH

Si los campos de esa tabla están separados usando "tabulación", entonces lo tienes fácil y puedes utilizar el ejemplo que mostré.

En cambio, si se usa un espacio para separar los campos, y si además hay nombres compuestos cómo has comentado, entonces no hay nada que sea viable, porque realmente necesitarías gestionar una base de datos de nombres para tomarla como referencia a la hora de delimitar correctamente los campos y así poder aumentar la probabilidad de éxito (no sería 100% fiable).

Lo único que se me ocurre, en caso de que los campos esten separados por espacios y no por tabulaciones, es que le pidas al autor de la aplicación que modifique el código para usar un caracter delimitable (por ejemplo un punto y coma ";"), por que el diseño actual sería incorrecto e improductivo.

PD: Y si la aplicación es un ensamblado .Net y no puedes recurrir a la ayuda del autor, entonces siempre puedes recurrir a la mágia de la ingenieria inversa (en este caso utilizando técnicas mediante Reflection) para localizar y modificar el caracter que está usando el programa para separar las celdas.

Saludos.








ServH

@Eleкtro

Pues intenté hablar con el desarrollador, y le pedí que incluyera un módulo para que el campo que el usuario rellena como "nombre" que luego acaba siendo el asunto del correo si eliges la opción de enviar la imagen lo cambiara, pero ni caso.

Se me estaban ocurriendo un par de cosas con java, y tener un .jar sencillo que me haga la misma función, además de que tengo más libertad para programar en este lenguaje.

Seguramente, abra otro hilo, para no ensuciar este, y pediré algún que otro consejo ya que estoy oxidado.

Muchas gracias @Eleкtro por la ayuda prestada hasta el momento.
Un saludo.

light310oct

#318
Yo tengo una duda sobre algo que he intentado hacer con VB6.0 y nada mas no he podido sera que lo podre hacer con un batch?, la idea es agregar datos entre la ultima etiqueta    "</tr>"y la etiqueta "</table>"a fin de ir armandome una tabla con datos de una variable
Código (html4strict) [Seleccionar]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
   <head>

       <title>Tabla de registro</title>
   </head>
   <body>

             <td>Celda 1</td>
             <td>Celda 2</td>
             <td>Celda 3</td>
         </tr>
         <tr>
             <td>Celda 4</td>
             <td>Celda 5</td>
             <td>Celda 6</td>
         </tr>
       </table>
   </body>
</html>
Si buscas resultados distintos, no hagas siempre lo mismo

Eleкtro

Cita de: light310oct en 29 Marzo 2015, 23:04 PM
Yo tengo una duda sobre algo que he intentado hacer con VB6.0 y nada mas no he podido sera que lo podre hacer con un batch?, la idea es agregar datos entre la ultima etiqueta    "</tr>"y la etiqueta "</table>"a fin de ir armandome una tabla con datos de una variable

Si, es posible hacerlo, pero la forma de llevar a cabo esa tarea en un lenguaje simple cómo Batch resultaría en un código bastante tedioso e ineficiente, Batch no puede manipular documentos Html, y además, ya que estás utilizando un lenguaje más apto no deberías rebajar el nivel a una herramienta simplona cómo Batch, no hay necesidad ni justificación para hacer eso,
lo mejor es que intentes seguir haciéndolo en un lenguaje capacitado, yo personalmente te recomiendo VB.Net/C#, aunque de todas formas en VB6 puedes utilizar expresiones regulares para hacerlo de una manera menos efectiva.

Saludos