Читать файл построчно в PowerShell

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

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

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

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

3 ответов


не так много документации по циклам 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
}

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

C# (.NET) file reader читает каждую строку по одному

Лучший Performace

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

или

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

на foreach заявление, вероятно, будет немного быстрее, чем ForEach-Object, но это потому, что загрузка всего этого в память обычно происходит быстрее.


по умолчанию Get-Content считывает всю строку в текстовом файле и создает массив в качестве его вывода с каждой строкой текста в качестве элемента в этом массиве.В этом случае номер индекса массива равен номеру строки текстового файла. Поэтому мы можем получить каждую строку текстового файла, используя номер индекса массива.

вы можете зациклить массив для чтения каждой строки.

$TxtContent = Get-content-Path "C:\path\TestFile - ... формат txt"

$TxtContent1
$TxtContent[2]

[см. это для полного примера] : http://dotnet-helpers.com/powershell-demo/reading-from-text-files-with-powershell/