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.
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
}
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).