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.

amslop

Hola! Acabo de ver el articulo sobre "Acciones sobre archivos de texto" y la verdad que me ha ayudado bastante, pero no consigo encontrar una solución a lo que quiero hacer (es una practica que me han mandado para clase, pero no tengo idea de como hacerla):

Pidiendo una frase por teclado, buscar en dicha frase el una palabra que nos dan después.

Había pensado meter la frase en una variable y luego, dentro de esa variable, cambiar los espacios por saltos de linea e introducirlo todo en un documento de texto. Muy bonito todo, pero no sé como meter una frase dentro de una variable ni como cambiar los espacios por saltos de línea.

Espero que podáis ayudarme. Gracias :)

MauriH

#261
Hola Leo,
Me parece muy bueno el post, pero no encontré (o de pronto no me di cuenta) alguna consulta q se relacione con mi problema, verás tengo dos archivos, uno de ellos es un banco de preguntas (examen) tipo opción múltiple, cada pregunta tiene 5 opciones, y el otro archivo es el archivo de respuestas, donde estan listadas todas las respuestas en el orden en q aparece las preguntas en el archivo de preguntas. Lo q quiero saber es como puedo yo hacer para poder buscar por medio de un archivo .bat todo lo q esta en el archivo de respuestas en el archivo de preguntas e ir marcando esas coincidencias con una palabra clave, quisiera q esa palabra clave figure antes y despues de la opcion correcta. No es necesario una palabra clave para marcar cada una de las opciones correctas, esta bien, de hecho mejor si es la misma para todas las coincidencias, espero haberme explicado. Gracias.
Te mando una parte de lo q seria el archivo de preguntas y de respuestas, estos son respectivamente:

Archivo de preguntas:


El masaje cardiaco externo:
• No se realiza en recién nacidos
• Se realiza en la mitad superior del esternón en el adulto
• Produce un flujo sanguíneo 25 % del normal
• No esta indicado en la fibrilación ventricular sostenida
• Todas las anteriores

La administración intracardiaca de drogas durante RCP:
• Requiere mayor dosis de drogas
• Puede producir lesión irreversible en el corazón
• Es la vía de elección en la reanimación a tórax abierto
• La vía de abordaje es paraesternal izquierda
• Todas son ciertas

La adrenalina:
• Posee efecto beta predominante
• Se sintetiza en el hígado
• Tiene mayor efecto en la acidosis metabolica
• Aumenta la presión de perfusión durante la RCP
• Todas

Para diagnosticar la circulación ineficaz:
• El ECG es el método de elección
• Palpar el pulso en la arteria femoral o carótida
• Se han descrito alteraciones en el metabolismo de los ácidos grasos libres
• Ausencia de reflejos fotomotores
• Todas

En la evaluación preoperatoria de un paciente ASA I de 30 años es indispensable:
• Solicitar un ECG de rutina
• Abetalipoproteinemia
• Realizar un examen clínico completo
• Solicitar un coagulograma de rutina
• Todas
Archivo de respuestas:


• Todas las anteriores
• Todas son ciertas
• Se sintetiza en el hígado
• Se han descrito alteraciones en el metabolismo de los ácidos grasos libres
• Abetalipoproteinemia
Y quisiera obtener algo así:


El masaje cardiaco externo:
• No se realiza en recién nacidos
• Se realiza en la mitad superior del esternón en el adulto
• Produce un flujo sanguíneo 25 % del normal
• No esta indicado en la fibrilación ventricular sostenida
• monordi1Todas las anterioresmonordi2

La administración intracardiaca de drogas durante RCP:
• Requiere mayor dosis de drogas
• Puede producir lesión irreversible en el corazón
• Es la vía de elección en la reanimación a tórax abierto
• La vía de abordaje es paraesternal izquierda
• monordi1Todas son ciertasmonordi2

La adrenalina:
• Posee efecto beta predominante
• monordi1Se sintetiza en el hígadomonordi2
• Tiene mayor efecto en la acidosis metabolica
• Aumenta la presión de perfusión durante la RCP
• Todas

Para diagnosticar la circulación ineficaz:
• El ECG es el método de elección
• Palpar el pulso en la arteria femoral o carótida
• monordi1Se han descrito alteraciones en el metabolismo de los ácidos grasos libresmonordi2
• Ausencia de reflejos fotomotores
• Todas

En la evaluación preoperatoria de un paciente ASA I de 30 años es indispensable:
• Solicitar un ECG de rutina
• monordi1Abetalipoproteinemiamonordi2
• Realizar un examen clínico completo
• Solicitar un coagulograma de rutina
• Todas

pincharata

Hola a todos, quisiera saber si pueden ayudarme con un archivo de texto donde todos los dias me dejan un log de la siguiente manera (aclaro que esta cortado pero tiene miles de filas):

name-label ( RW)       : XXXX01
memory-actual ( RO): 3435969740
VCPUs-number ( RO): 
name-label ( RW)       : Control domain on host: ZZZZ01
memory-actual ( RO): 78695628
VCPUs-number ( RO): 
os-version (MRO):  in database
name-label ( RW)       : Control domain on host: ZZZZ02
memory-actual ( RO): 78695628
VCPUs-number ( RO): 
os-version (MRO):  in database
name-label ( RW)       : XXXX02
memory-actual ( RO): 6871943168
VCPUs-number ( RO): 
name-label ( RW)       : XXXX03
memory-actual ( RO): 6871943577
VCPUs-number ( RO): 
name-label ( RW)       : XXXX04
memory-actual ( RO): 6871943168
VCPUs-number ( RO): 

Lo que necesito hacer es que elimine el salto de linea y lo remplace por una coma, a excepcion de las líneas que empiezan con "name-label", tras lo cual el archivo deberia de quedar:

name-label ( RW)       : XXXX01, memory-actual ( RO): 3435969740, VCPUs-number ( RO): 
name-label ( RW)       : Control domain on host: ZZZZ01, memory-actual ( RO): 78695628, VCPUs-number ( RO): , os-version (MRO):  in database
name-label ( RW)       : Control domain on host: ZZZZ02, memory-actual ( RO): 78695628, VCPUs-number ( RO): , os-version (MRO):  in database
name-label ( RW)       : XXXX02, memory-actual ( RO): 6871943168, VCPUs-number ( RO): 
name-label ( RW)       : XXXX03, memory-actual ( RO): 6871943577, VCPUs-number ( RO):
name-label ( RW)       : XXXX04, memory-actual ( RO): 6871943168, VCPUs-number ( RO):

Gracias a un aporte de Leo Gutierrez logro quitar el salto con el codigo:

for /f "tokens=*" %%_ in (file.txt) do (<nul set /p "=%%_ "; >> listar2.txt)

Muchas gracias.

leogtz

#263
@pincharata

A ver si te funciona esto.

Código (bash) [Seleccionar]
@echo off

for /f "tokens=*" %%_ in (file2.txt) do (
echo %%_ | findstr /r "^name" > nul 2>&1 && (
echo. >> end.txt
)
echo %%_ | findstr /r "^name" > nul 2>&1 && (
<nul set /p "=%%_ " >> end.txt
) || (
<nul set /p "=, %%_ " >> end.txt
)
)


También podrías utilizar un script en Powershell:

Código (perl) [Seleccionar]
[String]$line = "";
foreach($line in $(Get-Content "$psscriptroot\file2.txt")) {
    $line = $line.Trim().TrimEnd().TrimStart();

    if($line.StartsWith("name-label")) {
        Write-Host
    }

    if($line.StartsWith("name-label")) {
        Write-Host [${line}] -NoNewline
    } else {
        Write-Host [${line}] -NoNewline
    }
   
}


@MauriH Lo verifico esta noche y te comento qué tal.

Saludos.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

leogtz

Cita de: MauriH en 12 Septiembre 2013, 18:46 PM
Hola Leo,
Me parece muy bueno el post, pero no encontré (o de pronto no me di cuenta) alguna consulta q se relacione con mi problema, verás tengo dos archivos, uno de ellos es un banco de preguntas (examen) tipo opción múltiple, cada pregunta tiene 5 opciones, y el otro archivo es el archivo de respuestas, donde estan listadas todas las respuestas en el orden en q aparece las preguntas en el archivo de preguntas. Lo q quiero saber es como puedo yo hacer para poder buscar por medio de un archivo .bat todo lo q esta en el archivo de respuestas en el archivo de preguntas e ir marcando esas coincidencias con una palabra clave, quisiera q esa palabra clave figure antes y despues de la opcion correcta. No es necesario una palabra clave para marcar cada una de las opciones correctas, esta bien, de hecho mejor si es la misma para todas las coincidencias, espero haberme explicado. Gracias.
Te mando una parte de lo q seria el archivo de preguntas y de respuestas, estos son respectivamente:

Archivo de preguntas:


El masaje cardiaco externo:
• No se realiza en recién nacidos
• Se realiza en la mitad superior del esternón en el adulto
• Produce un flujo sanguíneo 25 % del normal
• No esta indicado en la fibrilación ventricular sostenida
• Todas las anteriores

La administración intracardiaca de drogas durante RCP:
• Requiere mayor dosis de drogas
• Puede producir lesión irreversible en el corazón
• Es la vía de elección en la reanimación a tórax abierto
• La vía de abordaje es paraesternal izquierda
• Todas son ciertas

La adrenalina:
• Posee efecto beta predominante
• Se sintetiza en el hígado
• Tiene mayor efecto en la acidosis metabolica
• Aumenta la presión de perfusión durante la RCP
• Todas

Para diagnosticar la circulación ineficaz:
• El ECG es el método de elección
• Palpar el pulso en la arteria femoral o carótida
• Se han descrito alteraciones en el metabolismo de los ácidos grasos libres
• Ausencia de reflejos fotomotores
• Todas

En la evaluación preoperatoria de un paciente ASA I de 30 años es indispensable:
• Solicitar un ECG de rutina
• Abetalipoproteinemia
• Realizar un examen clínico completo
• Solicitar un coagulograma de rutina
• Todas
Archivo de respuestas:


• Todas las anteriores
• Todas son ciertas
• Se sintetiza en el hígado
• Se han descrito alteraciones en el metabolismo de los ácidos grasos libres
• Abetalipoproteinemia
Y quisiera obtener algo así:


El masaje cardiaco externo:
• No se realiza en recién nacidos
• Se realiza en la mitad superior del esternón en el adulto
• Produce un flujo sanguíneo 25 % del normal
• No esta indicado en la fibrilación ventricular sostenida
• monordi1Todas las anterioresmonordi2

La administración intracardiaca de drogas durante RCP:
• Requiere mayor dosis de drogas
• Puede producir lesión irreversible en el corazón
• Es la vía de elección en la reanimación a tórax abierto
• La vía de abordaje es paraesternal izquierda
• monordi1Todas son ciertasmonordi2

La adrenalina:
• Posee efecto beta predominante
• monordi1Se sintetiza en el hígadomonordi2
• Tiene mayor efecto en la acidosis metabolica
• Aumenta la presión de perfusión durante la RCP
• Todas

Para diagnosticar la circulación ineficaz:
• El ECG es el método de elección
• Palpar el pulso en la arteria femoral o carótida
• monordi1Se han descrito alteraciones en el metabolismo de los ácidos grasos libresmonordi2
• Ausencia de reflejos fotomotores
• Todas

En la evaluación preoperatoria de un paciente ASA I de 30 años es indispensable:
• Solicitar un ECG de rutina
• monordi1Abetalipoproteinemiamonordi2
• Realizar un examen clínico completo
• Solicitar un coagulograma de rutina
• Todas

Hola @MauriH

¿Podrías por favor un ejemplo de cómo quisieras la salida del archivo final o de lo que quisieras obtener?

Es que no me queda claro como quieres relacionar el archivo de preguntas y de respuestas con un archivo final.

Saludos.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

pincharata

#265
Cita de: Leo Gutiérrez. en 13 Septiembre 2013, 04:33 AM
@pincharata

A ver si te funciona esto.

Código (bash) [Seleccionar]
@echo off

for /f "tokens=*" %%_ in (file2.txt) do (
echo %%_ | findstr /r "^name" > nul 2>&1 && (
echo. >> end.txt
)
echo %%_ | findstr /r "^name" > nul 2>&1 && (
<nul set /p "=%%_ " >> end.txt
) || (
<nul set /p "=, %%_ " >> end.txt
)
)


También podrías utilizar un script en Powershell:

Código (perl) [Seleccionar]
[String]$line = "";
foreach($line in $(Get-Content "$psscriptroot\file2.txt")) {
   $line = $line.Trim().TrimEnd().TrimStart();

   if($line.StartsWith("name-label")) {
       Write-Host
   }

   if($line.StartsWith("name-label")) {
       Write-Host [${line}] -NoNewline
   } else {
       Write-Host [${line}] -NoNewline
   }
   
}


@MauriH Lo verifico esta noche y te comento qué tal.

Saludos.

Leo, muchas gracias, pero lo acabo de ejecutar y verificar con mayor detenimiento y veo que repite en la salida el resultado de la búsqueda "name", por más que intento entender y modificar el script estoy muy lejos de ello y no logro corregirlo...  lamento molestarte nuevamente a ver si podrás ayudarme.

Utilizo el script en batch por que el de powershell no me funcionó en absoluto (la salida es por pantalla y no escribe en ningún archivo, puede ser?).

La salida final que obtengo es:
Citar
name-label ( RW)       : XXXX01  , name-label ( RW)       : XXXX01  , memory-actual ( RO): 3435969740  , VCPUs-number ( RO):   
name-label ( RW)       : Control domain on host: ZZZZ01  , name-label ( RW)       : Control domain on host: ZZZZ01  , memory-actual ( RO): 78695628  , VCPUs-number ( RO):   , os-version (MRO):  in database   
name-label ( RW)       : Control domain on host: ZZZZ02 , name-label ( RW)       : Control domain on host: ZZZZ02 , memory-actual ( RO): 78695628  , VCPUs-number ( RO):   , os-version (MRO):  in database   
name-label ( RW)       : XXXX02  , name-label ( RW)       : XXXX02  , memory-actual ( RO): 6871943168  , VCPUs-number ( RO):   
name-label ( RW)       : XXXX03  , name-label ( RW)       : XXXX03  , memory-actual ( RO): 6871943577  , VCPUs-number ( RO):   
name-label ( RW)       : XXXX04  , name-label ( RW)       : XXXX04  , memory-actual ( RO): 6871943168  , VCPUs-number ( RO):   


togangel

Hola a todos un gran saludo, los felicito por este tutorial en el cual me he basado en aprender un poco de este tema. Sin embargo tengo una consuta que hacerles, ya que he buscado por todos lados y no logro encontrarlo ya que estoy chamaco en esto.

Estoy buscando un Batch más reducido en el cual se este automatizando algunas configuraciones en el equipo, por ejemplo tengo este:



@echo off
color 0a
Mode con cols=46 lines=28
Title .:: %computername% ::. - .:: %username% ::.

:ip
set /p suc= Numero de area (ej. 290) :
cls

set /p ter= Numero de terminal IP ( ej. 120 ) :
cls

set /a suc2=%suc%-250
set ip=10.40.%suc2%.%ter%
set maskar=255.255.255.0
set get=110.40.%suc2%.1
set dns1=110.30.2.22
set dns2=110.1.5.11

netsh interface ip set address name="Conexi¢n de  rea local" source=static addr=%ip% mask=%maskar% gateway=%get% store=persistent
netsh interface ip set dnsservers name="Conexi¢n de  rea local" source=static addr=%dns1%
netsh interface ip add dnsservers name="Conexi¢n de  rea local" addr=%dns2% index=2

:vw
cls
echo  Area %suc% Terminal %ter%
echo.
echo  Ip       %ip%
echo  Marcara  %maskar%
echo  GateWay  %get%
echo  DNS 1    %dns1%
echo  DNS 2    %dns2%
timeout /nobreak 03

:pw
cls
set admn=Administrador
set admp=Admin$2011.1
set usern=Usuario
set userp=User$2011.1

net user "%admn%" %admp%
echo Usuario    %admn%
echo Contrase a %admp%
timeout /nobreak 03

net user "%usernn%" %userp%
echo Usuario    %usern%
echo Contrase a %userp%
timeout /nobreak 03

:fin
cls
tasklist>"%temp%\tsk.tmp"
set tp="%temp%\tsk.tmp"

set p1=Firefox.exe
set p2=explorer.exe
set inst1=%homedrive%\programas\programa1.exe
set inst2=%homedrive%\programas\programa2.exe

set ins=0

:p1
<"%tp%" find /c /i "%p1%"> NUL
if %ERRORLEVEL% EQU 0 (
goto pok) else (
goto pno)

:pok
cls
color 0a
echo  El Programa %p1% Esta instalado correctamente
pause>nul
goto p2

:pno
cls
color 0c
echo  El Programa %p1% No se esta ejecutando correctamente
echo.
echo  Presione 1 + [Enter] para instalarlo
echo.
set /p ins=
if %ins% == 0 (goto p2)
if %ins% == 1 (goto inst1)

:inst1
"%inst1%"

:p2
<"%tp%" find /c /i "%p2%"> NUL
if %ERRORLEVEL% EQU 0 (
goto p2ok) else (
goto p2no)

:p2ok
color 0a
cls

echo  El Programa %p2% Esta instalado correctamente
pause>nul
goto exit

:p2no
cls
color 0c
echo  El Programa %p2% No se esta ejecutando correctamente
echo.
echo  Presione 1 + [Enter] para instalarlo
echo.
set /p ins=
if %ins% == 0 (goto exit)
if %ins% == 1 (goto inst2)

:inst2
"%inst2%"

:exit
del /f /q %tp%
exit



Aquí lo que estoy intentando es que al checar en Tasklist se encuentren los programas ejecutando, en caso contrario Tener la opción de Instalarlo desde un directorio en C:\bla\bla.exe.

Sí me funciona muy bien este Batch que he hecho pero...

La cuestión es si en la variable :fin se puede simplificar con algun for o tomar el nombre del programa y usarlo como una variable, ya que siento que esta muy extenso. Así mismo si se tomara como variable utilizarlo despues para otros usos, un ejemplo. Terminar con procesos no deseados

Sin más por el momento, me gustaria tener algo de ayuda Genios!!!

Muchas Gracias.

Pédrin-2

Hola soy nuevo en esto, y quiero aprender lo veo muy interesante.
Lo que necesito creo que no es dificil, despues de ver por encima lo que se hace.

Lo explico:
Dentro de una carpeta tengo todo tipo de archivos, desde .avi, .flv, xls, etc..

que al ejecutar el batch me creara una carpeta " extensiones" y dentro creara
por cada archivo real ( ejemplo:  video 1.avi ) un  ( txt ), pero con la misma extension del original
Evidentemento el archivo creado no se vera nada, tamaño en carpeta 0.

No se si me he explicado bien

Un saludo y espero que podais ayudar a un novato

Pido disculpas por las pifias que pueda decir. el unico fin es ayudar y aprender.
        Un Saludo

leogtz

#268
Cita de: Pédrin-2 en 15 Septiembre 2013, 16:50 PM
Hola soy nuevo en esto, y quiero aprender lo veo muy interesante.
Lo que necesito creo que no es dificil, despues de ver por encima lo que se hace.

Lo explico:
Dentro de una carpeta tengo todo tipo de archivos, desde .avi, .flv, xls, etc..

que al ejecutar el batch me creara una carpeta " extensiones" y dentro creara
por cada archivo real ( ejemplo:  video 1.avi ) un  ( txt ), pero con la misma extension del original
Evidentemento el archivo creado no se vera nada, tamaño en carpeta 0.

No se si me he explicado bien

Un saludo y espero que podais ayudar a un novato

Hola @Pédrin-2, por favor deja un ejemplo de salida.

O sea, déjame un ejemplo hipotético de cómo quedaría, por que la verdad no te he entendido esta parte:

Citardentro creara
por cada archivo real ( ejemplo:  video 1.avi ) un  ( txt ), pero con la misma extension del original

¿¿Cómo que un archivo txt pero con la misma extensión del archivo original?

¿Te refieres a que se crearía un archivo igual que el original pero vacío?

Si es así esto podría servir:
Código (bash) [Seleccionar]
@echo off
set "work_dir=trunk"
if not exist %work_dir%\extensiones (
    mkdir "%work_dir%\extensiones" && (
        echo Directorio "%work_dir%\extensiones" creado
    )
)
pushd "%work_dir%"
for /f "tokens=*" %%_ in ('dir /b /a-d .') do (
    echo. > "extensiones\%%_"
)
popd
pause
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

Pédrin-2

Hola Leo muchisimas gracias por ayudarme.

Tengo una carpeta: Mis Peliculas, dentro hay:
spìderman.avi  = 700 mb
cars.avi = 700 mb
foto1.jpg = 6 mb, etc...

el resultado dentro de esa misma carpeta seria:
Carpeta: Extensiones dentro:
spìderman.avi  = 0 mb
cars.avi = 0 mb
foto1.jpg = 0 mb, etc...

Espero que se me entienda.

El ejemplo que me pones me crea dos carpetas una llamada trunk que no es necesaria y la otra de extensiones es la que necesito, pero el bat me dice que no encuentra nada.

Un saludo

Pido disculpas por las pifias que pueda decir. el unico fin es ayudar y aprender.
        Un Saludo