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

Marion Paul Kenneth Mendoza 2023年1月30日
  1. Get-Content コマンドレット構文の改善
  2. switch を使用して特定の行をロードする
  3. PowerShell の [System.IO.File] クラスを使用してファイルを 1 行ずつ読み取る
Windows PowerShell でファイルを 1 行ずつ読み取る

Windows PowerShell では、Get-Content コマンドレットを使用してファイルからファイルを読み取ることができます。ただし、コマンドレットはファイルの内容全体を一度にメモリにロードするため、大きなファイルでは失敗またはフリーズします。

この問題を解決するために私たちにできることは、ファイルを 1 行ずつ読み取ることです。この記事では、その方法を説明します。

始める前に、複数行のサンプルテキストファイルを作成することをお勧めします。たとえば、次の行を含む file.txt を作成しました。

file.txt

one
two
three
four
five
six
seven
eight
nine
ten

Microsoft によると、正規表現はテキストを照合するために使用されるパターンです。リテラル文字、演算子、およびその他の構成要素で構成できます。この記事では、$regex で示される正規表現と呼ばれる標準変数を含むさまざまなスクリプトを試します。

Get-Content コマンドレット構文の改善

Get-Content コマンドレットには、大きなファイルをロードするときに、ファイルのコンテンツを一度にメモリにロードするため、欠陥があることを最初に説明しました。ただし、foreach ループを使用して行を 1つずつロードすることで改善できます。

サンプルコード:

foreach($line in Get-Content .\file.txt) {
    if($line -match $regex){
        Write-Output $line
    }
}

switch を使用して特定の行をロードする

$regex 変数を使用して、カスタム $regex 値を作成し、それを switch case 関数で照合することにより、ファイルに特定の行を入力できます。

サンプルコード:

$regex = '^t'

switch -regex -file file.txt {
  $regex { "line is $_" } 
}

出力:

line is two
line is three
line is ten

この例では、$regex のカスタム値を定義しました。これは、文字 t で始まる場合にのみ行を照合して表示します。

PowerShell の [System.IO.File] クラスを使用してファイルを 1 行ずつ読み取る

.NET ライブラリにアクセスできる場合は、[System.IO.File] クラスを使用してファイルからコンテンツを読み取ることができます。ファイルを 1 行ずつ処理するために正規表現を必要としないため、Get-Content の優れた代替手段です。

サンプルコード:

foreach($line in [System.IO.File]::ReadLines("C:\yourpathhere\file.txt"))
{
    Write-Output $line
}
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn

関連記事 - PowerShell File