Читання файлу по рядках в PowerShell

Я хочу прочитати файл рядок за рядком в PowerShell. Зокрема, я хочу циклічно переглядати файл, зберігати кожен рядок у змінній в циклі і виконувати деяку обробку в рядку.

Я знаю еквівалент Bash:

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

Не так багато документації по циклам PowerShell.

Рішення

Не так багато документації по циклам PowerShell.

Документації по циклам в PowerShell досить багато, і ви можете ознайомитися з наступними темами довідки: [про_For (https://docs.microsoft.com/en-gb/powershell/module/microsoft.powershell.core/about/about_for), [про_ForEach (https://docs.microsoft.com/en-gb/powershell/module/microsoft.powershell.core/about/about_foreach), [про_Do (https://docs.microsoft.com/en-gb/powershell/module/microsoft.powershell.core/about/about_do), [про_While (https://docs.microsoft.com/en-gb/powershell/module/microsoft.powershell.core/about/about_while).

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

Іншим ідіоматичним рішенням PowerShell для вашої проблеми є передача рядків текстового файлу в команду ForEach-Object:

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

Замість регекс-співставлення всередині циклу, ви можете пропустити рядки через Where-Object, щоб відфільтрувати лише ті, що вас цікавлять:

Get-Content .\file.txt | Where-Object {$_ -match $regex} | ForEach-Object {
    # Work here
}
Коментарі (3)

Get-Content має погану продуктивність, він намагається прочитати файл в пам'ять одразу.

Читач файлів на C# (.NET) читає кожен рядок по черзі

**Найкраща продуктивність

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

Або трохи менш продуктивний

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

Оператор foreach, ймовірно, буде трохи швидшим, ніж ForEach-Object (див. коментарі нижче для отримання додаткової інформації).

Коментарі (12)

Всемогутній вимикач тут спрацьовує якнайкраще:

Раз.
два
три' > файл

$regex = '^t'

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

Виведення:

рядок два
рядок три
Коментарі (0)