2011-07-28 108 views

Respuesta

25

Tubería a la Measure-Object cmdlet

Import-Csv C:\Directory\file.csv | Measure-Object 
+2

Gracias, esto parece funcionar, pero es terriblemente lento en comparación, por ejemplo, a GNU Unix utiliza wc.exe. – jrara

+1

Eso es porque wc.exe sería el equivalente a (Get-Content) .Length que, si bien es mucho más rápido que Import-CSV, también es una solución potencialmente incorrecta como lo señala stej, ya que no daría cuenta de las filas con campos multilínea. – EBGreen

+0

cosas geniales. Justo lo que necesitaba... –

6

general (CSV o no)

@(Get-Content c:\file.csv).Length 

Si el archivo tiene sólo una línea, a continuación, se producirá un error. (Se necesita el prefijo @ ... de lo contrario si el archivo tiene una línea, sólo se contará el número de caracteres en esa línea.

Get-Content c:\file.csv | Measure-Object -line 

Pero ambos se producirá un error si cualquier registro toma más de una . fila Entonces mejor csv importación y medida:

Import-Csv c:\file.csv | Measure-Object | Select-Object -expand count 
+0

El último parece generar un error: Select-Object: no se puede expandir la propiedad "count" porque no tiene nada que expandir. En línea: 1 char: 64 + Import-Csv C: \ Directory \ file.csv | Measure-Object | Select-Object <<<< -expand count – jrara

+0

Extraño, 'Measure-Object' debe devolver un objeto que tenga una propiedad Count. Intenta eliminar el '| Select-Object ...' y verás qué devuelve. – stej

+0

Probablemente estés usando PowerShell v1. En v1, 'Select-Object -expand propertyName' arroja un error cuando el resultado es un escalar (un objeto). Actualiza a v2 y listo. –

31

Get-contenido y medir a objetos están muy bien para archivos pequeños, pero ambos son muy ineficientes con la memoria que tenía verdaderos problemas con archivos de gran tamaño

Cuando.. contando filas en un archivo de 1GB usando cualquiera de los dos métodos, Powershell engulló toda la memoria disponible en el servidor (8GB) y luego comenzó a buscar en el disco. Lo dejé más de una hora, pero todavía estaba buscando 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 reduce el uso de la memoria a 25 MB muy razonables y es mucho, mucho más rápido, tomar 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 se come cantidades irrazonables de RAM, no importa cuán grande es su archivo es:

[int]$LinesInFile = 0 
$reader = New-Object IO.StreamReader 'c:\filename.csv' 
while($reader.ReadLine() -ne $null){ $LinesInFile++ } 

El fragmento anterior se puede insertar cualquier lugar que utilizaría conseguir-contenido o medida a objetos, simplemente se refieren a la variable $ LinesInFile a obtener el recuento de filas del archivo.

+0

Más rápido que cualquier otra solución que se muestra aquí. Menos de 5 segundos para ordenar un archivo csv de 500mb. – alextc

+0

También debe desechar el lector ($ reader.Dispose()) después de su uso o corre el riesgo de mantener el archivo abierto hasta que cierre su sesión de PS. –

0

Puede intentar

(Import-Csv C:\Directory\file.csv).count 

o

$a=Import-Csv C:\Directory\file.csv 
$a.count 
+0

Obtengo una 'OutOfMemoryException' usando este enfoque en un archivo grande. Usando 'Get-Content | Measure-Object' funciona con una cantidad limitada de memoria. –

0

(Import-Csv C:\Directory\file.csv).count es el único que precisa de éstos.

He intentado todas las otras sugerencias en un csv con 4781 filas, y todo pero éste volvió 4803.

Cuestiones relacionadas