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.
Dirigez-le vers l'applet de commande Measure-Object
Import-Csv C:\Directory\file.csv | Measure-Object
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.
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
(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.
Tu peux essayer
(Import-Csv C:\Directory\file.csv).count
ou
$a=Import-Csv C:\Directory\file.csv
$a.count