2015-11-04 11 views
20

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

私はバッシュ相当知っている:PowerShellのループ上の

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

あまりのドキュメントを。

答えて

40

PowerShellループに関するドキュメントはほとんどありません。 PowerShellでのループ上の

ドキュメントが豊富で、次のヘルプトピックをチェックアウトする場合があります:about_Forabout_ForEachabout_Doabout_While。あなたの問題に対する他の慣用のPowerShellソリューションは、パイプにForEach-Object cmdletへのテキストファイルの行である

foreach($line in Get-Content .\file.txt) { 
    if($line -match $regex){ 
     # Work here 
    } 
} 

:代わりに、ループ内で正規表現マッチングの

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

によって各行いずれかを読み込むリンクが壊れ、それらは今docs.microsoft.com' 'にリダイレクトされません。 –

+0

大きなファイルを読み込もうとするとGet-Contentは本当に悪いです。 –

+1

@KolobCanyonは本当に真です:-)サイズ/スケールでのパフォーマンスコストについて別の答えを追加できます –

8

Get-Contentのパフォーマンスが低下しています。一度にメモリにファイルを読み込もうとします。

C#(.NET)ファイルリーダ1

foreach($line in [System.IO.File]::ReadLines("C:\path\to\file.txt")) 
{ 
     $line 
} 
+0

おそらく '[System.IO.File] :: ReadLines(" C:\ path \ to \ file.txt ")を使用します。 ForEach-Object {...} '。 foreachステートメントは[コレクション全体をオブジェクトにロードする](https://blogs.technet.microsoft.com/heyscriptingguy/2014/07/08/getting-to-know-foreach-and-foreach-object/)です。 )。 'ForEach-Object'はパイプラインを使ってストリームします。これで、 'foreach'文は' ForEach-Object'コマンドよりも少し速くなりますが、それはメモリ全体に読み込むのが通常より速いからです。しかし、Get-Contentは依然としてひどい。 –

+0

@BaconBits 'foreach()'は 'Foreach-Object'のエイリアスです –

+5

これは非常によくある誤解です。 'foreach'は' if'、 'for'、' while'のような文です。 'ForEach-Object'は' Get-ChildItem'のようなコマンドです。 'ForEach-Object'には' foreach'のデフォルトエイリアスもありますが、パイプラインがある場合にのみ使用されます。 'Get-Help about_Foreach'の長い説明を参照するか、以前のコメントのリンクをクリックして、MicrosoftのThe Scripting Guysが文とコマンドの違いについての記事全体を参照してください。 –

関連する問題