Bestand regel voor regel lezen in PowerShell

Ik wil een bestand regel voor regel lezen in PowerShell. Meer specifiek wil ik een lus maken door het bestand, elke regel opslaan in een variabele in de lus, en wat verwerking doen op de regel.

Ik ken het Bash equivalent:

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

Niet veel documentatie over PowerShell loops.

Oplossing

Niet veel documentatie over PowerShell loops.

Documentatie over loops in PowerShell is er in overvloed, en je zou kunnen kijken naar de volgende help topics: about_For, about_ForEach, about_Do, about_While.

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

Een andere idiomatische PowerShell oplossing voor je probleem is om de regels van het tekstbestand te pijpen naar het ForEach-Object cmdlet:

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

In plaats van regex matching binnen de lus, zou je de regels door Where-Object kunnen leiden om alleen die te filteren waarin je'geïnteresseerd bent:

Get-Content .\file.txt | Where-Object {$_ -match $regex} | ForEach-Object {
    # Work here
}
Commentaren (3)

Get-Content heeft een slechte performance; het probeert het bestand in één keer in het geheugen te lezen.

C# (.NET) file reader leest elke regel één voor één

Beste prestatie

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

Of iets minder performant

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

Het foreach statement zal waarschijnlijk iets sneller zijn dan ForEach-Object (zie commentaar hieronder voor meer informatie).

Commentaren (12)

De almachtige schakelaar werkt hier goed:

'een
twee
drie' > bestand

$regex = '^t'

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

Uitvoer:

lijn is twee
lijn is drie
Commentaren (0)