web-dev-qa-db-fra.com

Lire le fichier ligne par ligne dans PowerShell

Je souhaite lire un fichier ligne par ligne dans PowerShell. Plus précisément, je souhaite parcourir le fichier, stocker chaque ligne dans une variable de la boucle et effectuer un traitement sur la ligne.

Je connais l'équivalent de Bash:

while read line do
    if [[ $line =~ $regex ]]; then
          # work here
    fi
done < file.txt

Pas beaucoup de documentation sur les boucles PowerShell.

69
Kingamere

Pas beaucoup de documentation sur les boucles PowerShell.

La documentation sur les boucles dans PowerShell est abondante et vous pouvez consulter les rubriques d'aide suivantes: about_For , about_ForEach , about_Do , about_While .

_foreach($line in Get-Content .\file.txt) {
    if($line -match $regex){
        # Work here
    }
}
_

Une autre solution idiomatique de PowerShell à votre problème consiste à diriger les lignes du fichier texte vers la cmdlet ForEach-Object :

_Get-Content .\file.txt | ForEach-Object {
    if($_ -match $regex){
        # Work here
    }
}
_

Au lieu de faire correspondre les expressions rationnelles à l'intérieur de la boucle, vous pouvez diriger les lignes à travers Where-Object pour filtrer uniquement celles qui vous intéressent:

_Get-Content .\file.txt | Where-Object {$_ -match $regex} | ForEach-Object {
    # Work here
}
_
127

Get-Content a de mauvaises performances. il essaie de lire le fichier en mémoire en une fois.

Le lecteur de fichiers C # (.NET) lit chaque ligne une par une

Meilleure Performance

foreach($line in [System.IO.File]::ReadLines("C:\path\to\file.txt"))
{
       $line
}

Ou légèrement moins performant

[System.IO.File]::ReadLines("C:\path\to\file.txt") | ForEach-Object {
       $_
}

L'instruction foreach sera probablement légèrement plus rapide que ForEach-Object (voir les commentaires ci-dessous pour plus d'informations).

39
Kolob Canyon

Le commutateur tout-puissant fonctionne bien ici:

'one
two
three' > file

$regex = '^t'

switch -regex -file file { 
  $regex { "line is $_" } 
}

Sortie:

line is two
line is three
0
js2010