web-dev-qa-db-fra.com

PowerShell: comment compter le nombre de lignes dans un fichier csv?

Comment puis-je compter le nombre de lignes dans un fichier csv à l'aide de powershell? J'ai essayé quelque chose comme

Get-Content -length "C:\Directory\file.csv"

ou

(Get-Content).length "C:\Directory\file.csv"

mais ceux-ci résultent d'une erreur.

16
jrara

Dirigez-le vers l'applet de commande Measure-Object

Import-Csv C:\Directory\file.csv | Measure-Object
26
Shay Levy

Get-Content et Measure-Object conviennent aux petits fichiers, mais les deux sont extrêmement inefficaces en mémoire. J'ai eu de vrais problèmes avec les gros fichiers.

Lors du comptage de lignes dans un fichier de 1 Go à l'aide de l'une ou l'autre méthode, Powershell a englouti toute la mémoire disponible sur le serveur (8 Go), puis a démarré la pagination sur disque. Je l'ai laissé plus d'une heure, mais comme c'était toujours la pagination sur le disque, je l'ai tué.

La meilleure méthode que j'ai trouvée pour les fichiers volumineux consiste à utiliser IO.StreamReader pour charger le fichier à partir du disque et compter chaque ligne à l'aide d'une variable. Cela limite l'utilisation de la mémoire à 25 Mo très raisonnable et est beaucoup, beaucoup plus rapide, prenant environ 30 secondes pour compter les lignes dans un fichier de 1 Go ou quelques minutes pour un fichier de 6 Go. Il ne consomme jamais une quantité de RAM déraisonnable, quelle que soit la taille de votre fichier:

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

L'extrait ci-dessus peut être inséré partout où vous utiliseriez get-content ou measure-object, il vous suffit de vous reporter à la variable $ LinesInFile pour obtenir le nombre de lignes du fichier.

33
Ten98

Généralement (csv ou pas)

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

Si le fichier n'a qu'une ligne, il échouera. (Vous avez besoin du préfixe @ ... sinon, si le fichier a une ligne, il ne comptera que le nombre de caractères dans cette ligne.

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

Mais les deux échoueront si un enregistrement prend plus d'une ligne. Alors mieux importer csv et mesurer:

Import-Csv c:\file.csv | Measure-Object | Select-Object -expand count
7
stej

(Import-Csv C:\Directory\file.csv).count est le seul exact parmi ceux-ci. 

J'ai essayé toutes les autres suggestions sur un CSV avec 4781 lignes, et toutes sauf celle-ci ont renvoyé 4803.

0
devonuto

Tu peux essayer 

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

ou 

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