PowerShellでファイルを一行ずつ読む

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
    }
}

ループ内での正規表現マッチングの代わりに、行をWhere-Objectに通すことで、興味のあるものだけをフィルタリングすることができます'。

Get-Content .\file.txt | Where-Object {$_ -match $regex} | ForEach-Object {
    # Work here
}
解説 (3)

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`よりもわずかに速くなる可能性があります(詳細は以下のコメントを参照してください)。

解説 (12)

ここでは全能のスイッチが活躍します。

'一
二
3' > ファイル

$regex = '^t'

スイッチ -regex -ファイル ファイル {
  $regex { "行は$_" }。
}

出力します。

線は2本
行は3つ
解説 (0)