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