Я хочу прочитать файл построчно в PowerShell. В частности, я хочу пройтись по файлу, сохранить каждую строку в переменной в цикле и выполнить некоторую обработку строки.
Я знаю эквивалент в Bash:
while read line do
if [[ $line =~ $regex ]]; then
# work here
fi
done < file.txt
Не так много документации по циклам PowerShell.
Не так много документации по циклам 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
}
}
Вместо regex-сопоставления внутри цикла, вы можете передать строки через Where-Object
, чтобы отфильтровать только те, которые вас интересуют:
Get-Content .\file.txt | Where-Object {$_ -match $regex} | ForEach-Object {
# Work here
}
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
(см. комментарии ниже для получения дополнительной информации).