Leggere il file riga per riga in PowerShell

Voglio leggere un file riga per riga in PowerShell. In particolare, voglio fare un ciclo attraverso il file, memorizzare ogni riga in una variabile nel ciclo, e fare qualche elaborazione sulla linea.

Conosco l'equivalente di Bash:

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

Non c'è molta documentazione sui loop di PowerShell.

Soluzione

Non c'è molta documentazione sui loop di PowerShell.

La documentazione sui cicli in PowerShell è abbondante, e potresti voler controllare i seguenti argomenti di aiuto: about_For, about_ForEach, about_Do, about_While.

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

Un'altra soluzione idiomatica di PowerShell al tuo problema è quella di incanalare le righe del file di testo alla cmdlet ForEach-Object:

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

Invece di far corrispondere la regex all'interno del ciclo, si potrebbe far passare le linee attraverso Where-Object per filtrare solo quelle a cui si è interessati:

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

Get-Content ha cattive prestazioni; cerca di leggere il file in memoria tutto in una volta.

Il lettore di file C# (.NET) legge ogni riga una per una

Migliori prestazioni

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

O leggermente meno performante

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

L'istruzione foreach sarà probabilmente leggermente più veloce di ForEach-Object (vedere i commenti qui sotto per maggiori informazioni).

Commentari (12)

L'interruttore onnipotente funziona bene qui:

'uno
due
tre' > file

$regex = '^t'

switch -regex -file file {
  $regex { "la linea è $_" }
}

Output:

la linea è due
la linea è tre
Commentari (0)