Girald lo siento he tenido que eliminar el otro hilo

He tenido que eliminar el otro hilo al que íbamos ya que, si querer expuse información no deseada, espero no ser perjudicial para ti pero espero aun más que me eliminen el otro hilo... Si tu puedes hacer algo por ponerlo privado o eliminarlo, lo antes posible, te lo agradecería un montón, en cualquier caso si no te importa y te interesa seguir ayudándome por aquí, házmelo saber en este hilo, si no pues lo entiendo y muchas gracias de todas formas por las molestias

1 respuesta

Respuesta
1

No acabo de entender lo que ha pasado, pero por lo que mí respecta no te preocupes. No puedo eliminar nada, solo he marcado que no quiero seguir respondiendo a ese hilo, que es lo único que he conseguido hacer.

Como sigo sin entender nada más que parece que querrías poder cambiar la línea 5 de un archivo me voy a centrar en eso, aunque intuyo que no te va a servir de mucho. Sería algo así:

@echo off
Setlocal EnableDelayedExpansion
set carpeta=d:\bat
set archivo=ctrltareas.bat
set lin=5
set param=edad
set /p valor=Introduce el valor a asignar al parametro %param%: 
del /q tmp.txt>nul 2>&1
set nlin=1
pushd %carpeta%
for /f "usebackq tokens=*" %%i in ("%archivo%") do (
   if not "!nlin!" == "%lin%" echo %%i>> tmp.txt
   if "!nlin!" == "%lin%" echo set %param%=%valor%>> tmp.txt
   set /a nlin=!nlin!+1
   )
echo copy /y tmp.txt %archivo%
Popd

Las variables CARPETA y ARCHIVO sirven para situarse en el entorno de pruebas que convenga. Se pide el valor a asignar al SET EDAD= y en lugar de reescribir el archivo de pruebas solo se hace un ECHO del COPY para ver si es correcto. De momento el archivo con la quinta línea modificada estaría en TMP.TXT

Muchas gracias lo pondré a prueba!

¿Lo único que no entiendo es porque eliminas el archivo tmp.txt después del set donde preguntas el valor?

Funciona perfectamente eres un CRACK, eso lo único que no entiendo es porque eliminas el archivo tmp.tx con un del/q . porque entiendo que ese archivo aun no existe, ¿no?

Es una costumbre, por si ya existiera, bien de una prueba previa o de otros usos. Una forma de evitar el borrado es usar ">" en vez de ">>" la primera vez que escribes en el archivo de salida pero eso te obliga a tratar de forma diferenciada la primera línea. Si lo borras previamente te aseguras de que no existe.

for /f "usebackq tokens=*" %%i in ("%archivo%") do (
   if not "!nlin!" == "%lin%" echo %%i>> tmp.txt
   if "!nlin!" == "%lin%" echo set %param%=%valor%>> tmp.txt
   (aqui se podrian añadir mas condicionales?)
   set /a nlin=!nlin!+1
Y si por ejemplo quisiera eliminar una linea , porque lo unico que
se me ocurre es o poner un  if "!nlin!" == "%lin%" echo.>> tmp.txt 
pero me deja un espacio en blanco en la linea que queiro eliminar y no interesa
o en sacar un echo que diga linea eliminada pero sin el "">>"".
Pero seguro que tiene que haber alguna manera de que la omita de que la elimine

Con esto ya creo que cerraria la pregunta , jejeje ! muchas gracias

Si quieres eliminar una línea, digamos la que has puesto en la variable LIN, basta con no hacer ECHO de la línea al archivo temporal:

for /f "usebackq tokens=*" %%i in ("%archivo%") do (
   if not "!nlin!" == "%lin%" echo %%i>> tmp.txt
   set /a nlin=!nlin!+1
   )

¡Gracias! Genial! ¿Qué hacer algo más para cerrar la pregunta maestro?

Nada más, de momento. Estaré encantado de intentar ayudarte en lo que sea, pero que no sea tan complejo.

Tal vez sea meterme donde no me llaman, pero creo que no estaría mal que intentaras abordar esta labor que tienes con la fichas según un esquema datos/programas de tratamiento. Si los datos los manejas en versión CSV (campos separados por punto y coma, aunque en el original inglés fuera por comas) los puedes abrir con Excel, y eso te puede aportar algunas facilidades. Por supuesto también puedes tratar los datos mediante "programas BAT". Ya sabes, las tres modalidades de tratamiento de datos son: altas, bajas y modificaciones

La verdad que no entiendo muy bien lo que es csv, la verdad que no me hago una idea. Es decir crear las fichas con excel, ¿qué serian los documentos con cuadriculas no? Yo es que en todo esto soy autodidacta, y voy aplicando la lógica con lo poco que se para crear cualquier cosa que se me ocurra. Desde que termine con este proyecto me quiero poner a indagar con el powershell y seguir aprendiendo python. Y poder hacer una version mejorada de lo que hago con bat.

¿csv es una terminación? En plan .txt o .bat..¿?

CSV es, efectivamente, una terminación (extensión, se le suele llamar en MSDOS/Windows). Viene del inglés "Comma Separated Values" (valores separados por comas) y es la forma más simple de "formatear" los datos en columnas pero sin usar códigos especiales. La primera línea de los archivos CSV (que en los países de habla hispana utilizan, más bien, el punto y coma en lugar de la coma para separar los valores de los campos aunque se siga utilizando esa extensión) suele ser la de las cabeceras (lo que serían los títulos de las columnas).

Voy a ver si con un ejemplo te ayudo a entender lo que te quiero transmitir. Imagina que quieres tener la información de una agenda. Lo primero que tienes que hacer es definir que campos debe tener esa agenda. Por ejemplo:
Nombre

Apellidos

Domicilio (calle, número, piso, puerta, distrito postal, población, provincia, país)

Teléfono (casa, trabajo, móvil)

Correo electrónico

Fecha de nacimiento

Estos campos los podrías poner en columnas y cada fila sería uno de los miembros de la agenda.

Te sugiero que copies lo siguiente:

Nombre;Apellidos;Calle;Número;Piso;Puerta;DP;Población;Provincia;País;Tfno Casa;Tfno Trabajo;Móvil;eMail;FNcto
Juan;López López;Sagasta;25;3;A;28012;Madrid;Madrid;España;913333333;914444444;666777888;[email protected];01/01/2000
Irene;García Pérez;Gran Vía;18;Bajo;A;36393;Baiona;Pontevedra;España;986333333;986444444;666777999;[email protected];01/01/2000

Sálvalo como PRUEBA.CSV. Si tienes Excel instalado verás que al abrir este archivo desde el Explorador de Windows te lo abre con Excel y te lo muestra así:

Esto te permitiría trabajar ese archivo ya desde Excel, que ofrece muchas posibilidades ya incluidas en el propio programa. Por ejemplo imprimir determinados campos, calcular las edades a día de hoy, hacer búsquedas, etc.

No sé si esto te abrirá posibilidades o no, pero bueno, ahí te lo dejo.

guau! genial! si me abres todo un campo de posibilidades jejejeeje, y esto de alguna manera se puede automatizar con los bat, quiero decir puedo, dar de alta y de baja y modificar contenido con un bat?, porque para añadir usuarios o para eliminar me hago una ligera idea, creo, de como se puede automatizar pero para modificar no lo veo tan claro, y en el caso de que necesite recoger los datos de un usuario "x"  si los datos fueran para rellenar una plantilla de un informe cualquiera y esta plantilla esta en un documento word,¿se podría automatizar con ese documento cvs?

Si partimos de que los datos de origen están en Word pero tienen formato de tabla/plantilla lo suyo sería pasarlos a Excel que es la mejor opción para tratar tablas. Si copias (con Ctrl-V) una tabla de Word y la pegas en Excel ya tendrás los datos en Excel. Excel siempre te permite guardar los datos como CSV y a partir de ese CSV (texto plano con campos separados por ";") puedes manejarlos con BAT. Pero independientemente de que puedas tratar los archivos CSV con un BAT lo más sencillo es tratarlos directamente con Excel sin más que cambiar lo que haya que cambiar, insertar, borrar o modificar y salvar el archivo modificado como CSV. Excel tiene muchísimas posibilidades y, aunque pueda parecer complicado, en realidad puede ser muy sencillo de usar.

No no yo me refiero a plantillas que son un texto word, por ejemplo imaginate que tienes que rellenar y enviar un informe evaluación... al cliente en si, por ejemplo. Estos informes en su mayoría son iguales, lo único que cambia es pues la dirección, el nombre, etc ( osea los datos específicos de cada usuario que estarían es el documento csv, ya que esto sea hace muy tedioso tener que estar poniendo nombre apellidos, etc cada vez que se quiera hacer un informe de evaluación nuevo, a mi se me ocurrió automatizar ese proceso, y que el bat se encargue de rellenar todos los campos donde van esos datos específicos de cada cliente y después mediante un START abro el documento con los datos específicos ya rellenados y solo tendría que escribir pues lo que seria la información exclusiva de cada informe ( no se si me explico, solo tendira que rellenar la parte del documento que siempre es cambiante, vamos que la idea es que pierda menos tiempo a la hora de tener que hacer la burrocracia je je, porque de alguna manera se pierde mucho tiempo poniendo lo que viene siendo el nombre, la dirección, etc.. cad vez que quiere rellenar un documento, y como estos documentos son prácticamente siempre los mismos... es verdad que hay una parte que es siempre cambiante de esos documentos pero tarda mucho menos si no tiene que poner los nombres y todos esos datos... pero serian documentos word en plan escritos).

Entonces a mi se me ocurrió crear archivos BAT con cada cliente y dentro de esos archivos bat simplemente hay una serie de SET que recogen los datos por separado en plan:

set nom=Paquito
set ape1=Oceano
set ape2=Atlantico
set direccion=la que sea
set tlf=621325451132459

Y así con todos los datos necesarios para automatizar el rellenado de este tipo de documentos, entoces cuando quiera rellenar un documento word pues cada usuario tiene una numeración y cada bat se llama igual que la numeración del usuario, es decir que si es el 001.paquito(se así se llamaría la carpeta de paquito) pues dentro de esa carpeta hay una serie de archivos donde salen todos los datos de paquito en formato word también y ademas hay un bat que se llama 001.bat, pues cada vez que quiera rellenar este tipo de documentos tediosos con paquito, hago una CALL al 001.bat y !rakaaa¡ Automáticamente relleno la mayor parte de estos informes despues queda una pequeña parte que siempre hay que rellenar a mano, por eso despues le suelto un START al documento ya rellenado.

Entonces mi pregunta es, yo pudo tener digamos, ¿todos los datos de cada cliente en un archivo csv y hacer lo mismo que pretendo hacer de rellenar este tipo de documentos?

Porque me imagino que el programilla en si seria mucho mas ligero si reuniera todos los datos en un solo archivo csv...

No acabo de entender lo que necesitas. Intuyo que, periódicamente, hay que enviar a una serie de "clientes" un informe personal y que se trata de que los datos del cliente se carguen automáticamente en una "plantilla" Word, aunque el texto del informe tenga que ser específico del cliente. Mira a ver si este vídeo te aporta algo:

https://www.youtube.com/watch?v=FMTIv5ydUuc 

wau SI! es genial! es justo lo que necesito , ahora tengo que investigar como hacerlo con libreoffice, pero seguro que hay algún tutorial, me pongo a ello, la verdad que hace tiempo le di caña al exel pero no es uno de mis fuertes, ya casi ni me acuerdo. Lo único malo  que a nivel de programación jejeje no tiene intringuli jajajajjaja. Mi idea era cuando terminara el prototipo en batch,  investigar y aprender a sacar alguna aplicación en phyton que funcionara mejor y mas completo, aunque hace poco descubrí que existía el powershell jejeje y también tengo ganas de darle caña , porque ademas estuve tonteando y todos los comandos bat funcionan para poweshell y es bastante mas potente a la hora de programar con el rollo de que tiene objetos y tal... pero la verdad que para mi bat no se son mis raíces en el mundo de la programación y le tengo cierto amor jajajajajja, pero a la vista esta que tengo que seguir avanzado en otros códigos porque aunque todavía en bat hay muchas cosas que no entiendo pero encuentro mas información para aprender otros códigos, y siempre que me pongo con algún código por ejemplo estuve dándole caña al javascript y aprender un poco de javascript  me ayudo a comprender mejor algunas cosas de bat, pero al final me estoy dando cuenta de que tengo que decidirme ha profundizar un codigo bien , porque ahora mismo tengo nociones básicas de javascript , nociones básicas de phyton y nociones básicas para el bat y me quedo a medias con todo.... y encima ahora tengo curiosidad por el powershell... Pero bueno seguiré proponiéndome nuevos retos jeje  ,es mi forma de aprender de manera autodidacta me propongo retos y me meto en la aventura de programar lo que se me ocurra.Mil Gracias de nuevo  por tus consejos son muy buenos!

Yo creo que programar puede ser una fuente de mucha alegría/placer si llevas dentro el gusanillo, como es mi caso. Básicamente todos los lenguajes de programación sirven para todo, aunque algunos resulten más adaptados a algunas cosas que otros. La programación orientada a objetos, con la que no he conseguido "comulgar", debe ser muy potente y debe simplificar mucho las cosas una vez que la asimilas pero también con la no orientada a objetos se puede conseguir lo mismo. Pero creo que uno debe crear programas cuando lo que ya hay no le sirve para lo que quiere, y la gestión de datos de cliente, con las consultas asociadas, no parece ser uno de esos casos. Si sirve de práctica está muy bien, pero no se trata de "matar pulgas a cañonazos". Si los datos son tablas sencillas, la gestión puede hacerse con hojas de cálculo, si no son tan sencillas y están interrelacionadas se hará con gestores de bases de datos (y tal vez utilizando SQL).

Bueno, soy un ferviente adorador de los BAT, aunque soy consciente de que dejan mucho que desear en cuanto a "transparencia", lo que hace que a veces no se puedan hacer algunas cosas porque ciertos caracteres no se pueden tratar correctamente. Y el poco trato que he tenido con Powershell ha sido siempre excelente. Siempre me ha resuelto los problemas que no podía resolver con BAT, aunque me haya obligado a "estudiar" un poco

Oye hablando de powerShell , he empezado a  indagar un poco, pero no encuentro digamos lo que en bat seria el GOTO o el CALL y  por ejemplo tampoco entiendo como decirle al programa hacia donde tiene que ir, que en bat se ponen los " : " .

Me imagino que tiene que ser algo como en phyton o javascript que se declaran "funciones" con "()" y después haces una llamada a la función o algo asi... pero no encuentro exactamente, osea claramente  como hacer este tipo de cosas cuando quieres jugar con el flujo de programación... 

Decían que prácticamente todos los comandos que se usan en BAT , pero justamente el goto no y el call parece que si pero se usa de otra manera o directamente no sirve en poweshell. Me gusta mucho el powerShell , básicamente porque admite números decimales jejejjeje...

Y si tengo el gusanillo y digamos que me esta tocando "estudiar un poco" ahora  a mi con esto del powershell pero desde que coja nociones básicas tengo muchas ideas que desarrollar , aunque solo sean por practica y placer jejejje.

La "programación" BAT es de una época muy antigua en la que los GOTO no estaban prohibidos. Ningún lenguaje de programación posterior permite eso. Siempre puede evitarse el GOTO incluyendo alguna variable en las condiciones de un bucle (DO WHILE o similar) cuyo valor puede cambiarse en el cuerpo del bucle para forzar a salir del bucle, que es lo que se suele pretender con un GOTO. Por tanto ni PowerShell, ni Java, ni Python, ni C, ni Pascal, etc. incluyen algo como el GOTO. Consecuentemente tampoco hay etiquetas de destino de un GOTO (las que echas de menos, las que empiezan por ":").
No se me ocurre como hacer un BAT de ejemplo con GOTO y luego otro que haga lo mismo sin GOTO, pero es que el "lenguaje" BAT no tiene estructuras repetitivas tipo DO WHILE o similares.

En cuanto al CALL sería, efectivamente, el equivalente a la "invocación" de una función interna (si el CALL va seguido de una etiqueta con ":") o externa si se invoca a otro ejecutable (BAT o EXE)

entonces digamos que para hacer un menú por ejemplo con distintas opciones, 5 por ejemplo,la lógica seria, crear un condicionas con un if y que llame a distintas funciones, internas, algo así ?... es que hace meses que no le doy caña al phyton y no recuerdo como era.. voy a tener que retomar el curso de phyton , ya que esta mucho mas completo que el de powershell... y después en cuanto pdf , tengo dos que explican todo lo que quiera acerca de powershell pero usan muchos "tecnisismos" que me pierdo .... :(

Pues sí, algo así

No sé si te servirá pero por si acaso te incluyo a continuación el código de un BAT y su correspondiente PowerShell (extensión PS1):

=================== Inicio del BAT ==============
@echo off
Setlocal EnableDelayedExpansion
set archini=DClargo.ini
set archsec=d:\carpeta prueba\bat\config.ini
set insert=N
set seccion=[Colors]
del /q kkk.ini>nul 2>&1
for /f "usebackq tokens=*" %%y in ("%archini%") do (
   set linea=%%y
   if "%%y" == "%seccion%" (
      for /f "usebackq tokens=*" %%a in ("%archsec%") do echo %%a>>kkk.ini&set insert=S
      ) else if "!insert!" == "N" (echo %%y>>kkk.ini
                ) else if not "%%y" == "%seccion%" if "!linea:~0,1!" == "[" echo %%y>>kkk.ini&set insert=N
   )
move /y kkk.ini %archini%
=================== Fin del BAT ==============
=================== Inicio del PS ==============
$archini = "DClargo.ini"
$archsec = "d:\carpeta prueba\bat\config.ini"
$seccion = "[Colors]"
$insert = "N"
Remove-Item kkk.ini -ErrorAction:SilentlyContinue
foreach ($linea in Get-Content $archini) {
   if ($linea -eq $seccion) {
      $insert = "S"
      foreach ($lin in Get-Content $archsec) {$lin | Out-File -FilePath kkk.ini -Append -Encoding default}
      }
      else {
           if ($insert -eq "N") {$linea | Out-File -FilePath kkk.ini -Append -Encoding default}
           else {
                if (($linea -ne $seccion) -And ($linea.Substring(0,1) -eq "[")) {
                   $insert = "N"
                   $linea | Out-File -FilePath kkk.ini -Append -Encoding default
                   }
                }
           }
   }
=================== Fin del PS ==============

¡Gracias!, tendré que analizarlo a fondo, pero la verdad que me canse y he optado por comprar unos cursos de fundamentos de la programación( que es bastante tostón pero me esta ayudando a entender cosas de manera universal que antes entendía a mi manera particular je je, y me decidí por perfeccionarme en python, ya que de powershell no encontré digamos recursos para mi nivel... y tengo una agenda de perfeccionar python cuando domine python quiero tontear con java porque me gusta lo clásico, después quiero hacer un curso de redes y para cuando domine todo esto, obio quiero retomar powershell, pero con powershell estaba dando palos de ciego y no me entero, me frustre...

Gracias por tu ayuda!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas