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