Подтвердить что ты не робот

Прочитать файл по строкам в PowerShell

Я хочу прочитать файл по строкам в PowerShell. В частности, я хочу прокрутить файл, сохранить каждую строку в переменной в цикле и выполнить некоторую обработку в строке.

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

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

Не хватает документации по циклам PowerShell.

4b9b3361

Ответ 1

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

Документация по циклам в PowerShell обильна, и вы можете просмотреть следующие разделы справки: about_For, about_ForEach, about_Do, 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
}

Ответ 2

Get-Content имеет плохую производительность; он пытается прочитать файл в память все сразу.

С# (.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 (см. Комментарии ниже для получения дополнительной информации).

Ответ 3

Всемогущий переключатель хорошо работает здесь:

'one
two
three' > file

$regex = '^t'

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

Выход:

line is two
line is three