Я хочу прочитати файл рядок за рядком в 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
}
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
(див. коментарі нижче для отримання додаткової інформації).