PowerShellでファイルを1行ずつ読みたい。具体的には、ファイルをループ処理し、そのループ内の変数に各行を格納して、その行に対して何らかの処理を実行します。
私は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
}
}
ループ内で正規表現のマッチングをする代わりに、 Where-Object
を使って行をパイプ処理して、興味のあるものだけをフィルタリングすることもできます。
Get-Content .\file.txt | Where-Object {$_ -match $regex} | ForEach-Object {
# Work here
}
Get-Content
はパフォーマンスが良くありません。ファイルを一度にメモリに読み込もうとします。
C#(.NET)ファイルリーダーが各行を1行ずつ読み取る
最高のパフォーマンス
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
よりわずかに速いでしょう(詳細は以下のコメントを参照してください)。