Jeg vil lese en fil linje for linje i PowerShell. Spesifikt vil jeg løkke gjennom filen, lagre hver linje i en variabel i løkken og gjøre litt behandling på linjen.
Jeg kjenner Bash-ekvivalenten:
while read line do
if [[ $line =~ $regex ]]; then
# work here
fi
done < file.txt
Ikke mye dokumentasjon på PowerShell-løkker.
Ikke mye dokumentasjon på PowerShell-løkker.
Dokumentasjon om løkker i PowerShell er rikelig, og det kan være lurt å sjekke ut følgende hjelpeemner: about_For
, about_ForEach
, about_Do
, about_While
.
foreach($line in Get-Content .\file.txt) {
if($line -match $regex){
# Work here
}
}
En annen idiomatisk PowerShell-løsning på problemet ditt er å pipe linjene i tekstfilen til ForEach-Object
cmdlet:
Get-Content .\file.txt | ForEach-Object {
if($_ -match $regex){
# Work here
}
}
I stedet for regex-matching inne i løkken, kan du sende linjene gjennom Where-Object
for å filtrere bare de du er interessert i:
Get-Content .\file.txt | Where-Object {$_ -match $regex} | ForEach-Object {
# Work here
}
Get-Content
har dårlig ytelse; den prøver å lese filen inn i minnet på en gang.
C# (.NET) filleser leser hver linje en etter en.
Beste ytelse
foreach($line in [System.IO.File]::ReadLines("C:\path\to\file.txt"))
{
$line
}
Eller litt dårligere ytelse
[System.IO.File]::ReadLines("C:\path\to\file.txt") | ForEach-Object {
$_
}
foreach
-setningen vil sannsynligvis være litt raskere enn ForEach-Object
(se kommentarer nedenfor for mer informasjon).