Leer las 5 primeras líneas de varios .txt

Estoy intentando hacer un script que me lea las 5 primeras líneas de todos los txt de la carpeta poniendo delante el nombre del archivo y separándolo por una línea en blanco. De momento he logrado hasta aquí. Pero el resto se me escapa :(

@echo off
for /f "tokens=*" %%a in ('dir /b/s *.txt') do type "%%a">>extraccion.txt

1 respuesta

Respuesta

Perdona que haya tardado tanto en atender esta consulta después de haberte sugerido que la hicieras. Lo cierto es que no recibí ningún mensaje de la página informándome de ella.

Esto es lo que he preparado para tu pregunta:

:: Para extraer las 5 primeras (número configurable) de una serie de archivos
:: Creando un nuevo archivo que tiene como primera línea el nombre del archivo
:: Seguido de una línea en blanco y con esos contenidos en nuevo archivo en carpeta destino
@echo off
Setlocal EnableDelayedExpansion
set carporig=d:\carpeta origen
set carpdest=d:\carpeta prueba
set /a nlind=5
set prefijo=nlin_
pushd %carporig%
for /f "tokens=*" %%a in ('dir /b *.txt') do call :tratarch "%%a"
popd
goto :eof
:tratarch
echo %~1>"%carpdest%\%prefijo%%~1"&echo.>>"%carpdest%\%prefijo%%~1"
set /a lin=1
for /f "usebackq tokens=*" %%x in (%1) do (
   if !lin! gtr %nlind% goto :eof
   echo %%x>>"%carpdest%\%prefijo%%~1"&set /a lin+=1
   )

He planteado el bat de manera que se usen variables para la carpeta origen, la carpeta destino, el número de líneas a leer y el prefijo a añadir al archivo de destino. Naturalmente estas variables deben configurarse con los valores que interesen.

Al volver a leer la pregunta me ha surgido la duda de que tal vez quieras agrupar en un único archivo todas las extracciones. Si fuera así utiliza esta otra versión:

@echo off
Setlocal EnableDelayedExpansion
set carporig=d:\carpeta origen
set archdest=d:\carpeta prueba\extraccion.txt
set /a nlind=5
del /q "%archdest%"
pushd %carporig%
for /f "tokens=*" %%a in ('dir /b *.txt') do call :tratarch "%%a"
popd
goto :eof
:tratarch
echo %~1>>"%archdest%"&echo.>>"%archdest%"
set /a lin=1
for /f "usebackq tokens=*" %%x in (%1) do (
   if !lin! gtr %nlind% goto :eof
   echo %%x>>"%archdest%"&set /a lin+=1
   )

puede que sea error mío pero estoy probando el 2º código que me has proporcionado y al ejecutar me muestra "el dispositivo no esta listo"

aprovecho para darte las gracias por tu ayuda

Supongo que has "personalizado" las variables. Es que eso de que "el dispositivo no esta listo" solo se me ocurre que se refiera a que alguna de las variables apunta a un disco/unidad que no exista.

Muéstrame un pantallazo de la ejecución y un listado del BAT

Disculpa borre sin querer un carácter por eso daba error.
Ahora funciona correctamente, solo una cosa más, el resultado es este:

archivo.txt
Dato 1
Dato 2
Dato 3
Dato 4
Dato 5
archivo2.txt
Dato 1
Dato 2
Dato 3
Dato 4
Dato 5
archivo3.txt
Lo correcto seria:
archivo.txt
Dato 1
Dato 2
Dato 3
Dato 4
Dato 5
archivo2.txt
Dato 1
Dato 2
Dato 3
Dato 4
Dato 5
archivo3.txt

Perdón me quito los espacios en blanco.

He visto 2 cosas, lo que quería decir en el comentario anterior que haría falta una línea en blanco después de las 5 líneas para que no se solape con los datos del siguiente archivo leído.

Y lo otro que veo es que cuando modifico set /a nlind=5 y pongo 13 o cualquiera que supere a 5 no funciona

Para lo primero sustituye la línea del IF por la siguiente:

   if !lin! gtr %nlind% (echo.>>"%archdest%"&goto :eof)

Para lo segundo solo se me ocurre que no hayas salvado el BAT o que hayas ejecutado uno distinto del que has salvado. Muéstrame el BAT con un TYPE o algo así.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas