web-dev-qa-db-ja.com

PowerShellでファイルを1行づつ読み取る

PowerShellでファイルを1行ずつ読みたい。具体的には、ファイルをループ処理し、そのループ内の変数に各行を格納して、その行に対して何らかの処理を実行します。

私はBashの同等物を知っています:

while read line do
    if [[ $line =~ $regex ]]; then
          # work here
    fi
done < file.txt

PowerShellループに関するドキュメントはあまりありません。

59
Kingamere

PowerShellループに関するドキュメントはあまりありません。

PowerShellのループに関するドキュメントは多数あります。次のヘルプトピックをチェックしてください。 about_Forabout_ForEachabout_Doabout_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
}
110

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よりわずかに速いでしょう(詳細は以下のコメントを参照してください)。

34
Kolob Canyon