Como obtener el número de filas de varios archivos, archivo a archivo, en PowerShell (PS)

Hola, hace tiempo que no escrito, pero por una petición de un sencillo script, pero muy útil para el trabajo y que puede venirle bien a más, vuelvo a publicar. Concretamente me pidieron un script en PowerShell que devuelva el número de líneas que tienen cada uno de los archivos de CSV de una carpeta. 

Lo cierto es que es muy sencillo y se puede escribir en una sola línea:

Get-ChildItem *.csv -Name | ForEach-Object { Write-Host $_ ";" (Get-Content $_).Length}

Realmente no tiene nada y con ligeros cambios se puede hacer que se haga de archivos .txt o cualquier otro archivo de texto. No tiene sentido en archivos binarios.

Por un lado, inicialmente leemos los ficheros de una carpeta que tengan la extensión buscada y que solo devuelva el nombre:

Get-ChildItem *.csv -Name

Después un pipe «|» para dirigir las salida y procesar los archivos propiamente dichos. Que esta parte hay varias formas de hacerla, incluso se pude pasar una lista, leer de un archivo, etc.

En cuanto a lo pedido, vamos a ir uno por uno y mirar su largo y mostrarlo por pantalla (entre el nombre y el número de líneas pongo un separador, pero no es necesario, aunque, para el caso concreto a resolver, necesitaban un par de datos más. Por cierto, el resultado poder guardarlo también como CSV).

Write-Host $_ ";" (Get-Content $_).Length

Writhe-Host podemos decir que es el equivalente al echo de CMD, o un PrintLn, etc, lo que se le pase lo mustra por pantalla, pero eso se podría substituir por guardarlo a un archivo, por ejemplo.

(Get-Content $_).Length

$_ representa a cada uno de los archivos y con Get-Content y su propiedad Length se obtiene el número de filas. Realmente hay 3 formas de sacar las filas que servirían, una es esa, las otras 2 serían con:

(Get-Content $_).Count

(Get-Content $_).Readcount

Que darían lo mismo. Realmente hay una cuarta opción y sería recurriendo a Measure-Object -Line

El resto es simplemente que se usa un ForEach-Object para recorrer cada uno de los nombre de archivos pasado. 

ForEach-Object { Write-Host $_ ";" (Get-Content $_).Length}

El resultado sería este:





Comentarios

Entradas populares