Solución:
Get-Content y Measure-Object están bien para archivos pequeños, pero ambos son muy ineficientes con la memoria. Tuve problemas reales con archivos grandes.
Al contar filas en un archivo de 1GB usando cualquier método, Powershell engulló toda la memoria disponible en el servidor (8GB), luego comenzó a paginar en el disco. Lo dejé más de una hora, pero todavía estaba pagándose en el disco, así que lo maté.
El mejor método que encontré para archivos grandes es usar IO.StreamReader para cargar el archivo desde el disco y contar cada fila usando una variable. Esto mantiene el uso de la memoria a unos 25 MB muy razonables y es mucho, mucho más rápido, ya que toma alrededor de 30 segundos para contar filas en un archivo de 1 GB o un par de minutos para un archivo de 6 GB. Nunca consume cantidades excesivas de RAM, sin importar el tamaño de su archivo:
[int]$LinesInFile = 0
$reader = New-Object IO.StreamReader 'c:filename.csv'
while($reader.ReadLine() -ne $null){ $LinesInFile++ }
El fragmento de código anterior se puede insertar donde quiera que use get-content o meter-object, simplemente consulte la variable $ LinesInFile para obtener el recuento de filas del archivo.
Típelo al Measure-Object
cmdlet
Import-Csv C:Directoryfile.csv | Measure-Object
Generalmente (csv o no)
@(Get-Content c:file.csv).Length
Si el archivo tiene solo una línea, fallará. (Necesita el prefijo @ … de lo contrario, si el archivo tiene una línea, solo contará el número de caracteres en esa línea.
Get-Content c:file.csv | Measure-Object -line
Pero ambos fallarán si algún registro ocupa más de una fila. Entonces es mejor importar csv y medir:
Import-Csv c:file.csv | Measure-Object | Select-Object -expand count