Windows PowerShell でファイルを 1 行ずつ読む方法

  1. Get-Content を使用して PowerShell で行単位でファイルを読み取る(ForEach ループ付き)
  2. Get-ContentForeach-Object を使用して PowerShell で行単位でファイルを読み取る
  3. PowerShell でファイルを行単位で読み取るための [System.IO.File] クラスを使用する
  4. PowerShell でファイルを行単位で読み取るための System.IO.StreamReader クラスを使用する
  5. 結論
Windows PowerShell でファイルを 1 行ずつ読む方法

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

この問題を解決するために、私たちはファイルを行単位で読み取ることができ、この文書ではその方法を示します。

始める前に、複数行のサンプルテキストファイルを作成するのが良いでしょう。たとえば、以下の行が含まれている file.txt を作成しました。

file.txt:

one
two
three
four
five
six
seven
eight
nine
ten

Microsoft によると、正規表現はテキストと一致させるためのパターンです。それはリテラル文字、演算子、およびその他の構造から構成される可能性があります。この文書では、$regex として示される標準変数を含む異なるスクリプトを試みます。

Get-Content を使用して PowerShell で行単位でファイルを読み取る(ForEach ループ付き)

最初に、Get-Content コマンドレットには、大きなファイルを読み込むときに欠点があることを議論しました。このコマンドレットはファイルの内容を一度にメモリに読み込むからです。しかし、foreach ループを使用して行を一つずつ読み込むことで改善できます。

例コード:

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

プロセスのステップバイステップの説明は以下の通りです:

  1. ファイルコンテンツの取得:

    Get-Content コマンドレットを使用してファイルの内容を読み取ることから始めます。

    Get-Content .\file.txt
    

    "file.txt"をファイルのパスに置き換えてください。

  2. 各行を繰り返す:

    次に、ファイル内の各行を反復処理するために ForEach ループを使用します。ループは、各行を変数 $line に一度に一つずつ割り当てます。

    ループ内では、Write-Host $line を置き換えて、要件に応じて各行を処理するコードを追加できます。この例では、単に Write-Host を使用して各行を表示していますが、望ましいアクションを実行できます。

Get-ContentForeach-Object を使用して PowerShell で行単位でファイルを読み取る

Get-Content を使用して PowerShell でファイルを行単位で読み取るには、以下の手順に従ってください:

  1. Get-Content コマンドレットを使用:

    Get-Content コマンドレットを使用してファイルの内容を読み取ることから始めます。Get-Content コマンドレットはファイルの各行を読み取り、パイプライン内のオブジェクトとして出力します。

    powershellCopy codeGet-Content -Path "example.txt" | ForEach-Object {
        # Process each line here
        $_  # $_ represents the current line
    }
    

"example.txt"をファイルのパスに置き換えてください。

  1. Foreach-Object ループ:

    次に、Foreach-Object コマンドレット(%Foreach-Object のエイリアスです)を使用してパイプライン内の各行を反復処理します。スクリプトブロック内({} 内のコード)では、$_ を使用して現在処理中の行を表現し、各行を処理できます。

    powershellCopy codeGet-Content -Path "example.txt" | ForEach-Object {
        # Process each line here
        $_  # $_ represents the current line
    }
    

    このループ内で、各行に対して必要なアクションを実行できます。

完全な動作コード例

以下は、ファイルを行単位で読み取り、各行を表示する完全な動作コード例です:

powershellCopy code# Specify the path to the file
$filePath = "example.txt"

# Check if the file exists
if (Test-Path $filePath) {
    # Read the file line by line and process each line
    Get-Content -Path $filePath | ForEach-Object {
        # Process each line here
        Write-Host $_
    }
} else {
    Write-Host "File not found: $filePath"
}

このコードでは:

  • $filePath 変数を使用してファイルのパスを指定します。
  • Test-Path コマンドレットを使用してファイルが存在するか確認します。
  • ファイルが存在する場合は、Get-Content を使用してその内容を読み取り、Foreach-Object に渡して処理します。
  • Foreach-Object のスクリプトブロック内で Write-Host $_ を使用して各行を表示します。

PowerShell でファイルを行単位で読み取るための [System.IO.File] クラスを使用する

PowerShell で [System.IO.File] クラスを使用してファイルを行単位で読み取るには、以下の手順に従ってください:

  1. ファイルパスの指定:

    読み取るファイルのパスを指定することから始めます。"example.txt"をファイルの実際のパスに置き換えてください。

    powershellCopy code
    $filePath = "example.txt"
    
  2. ファイルが存在するか確認:

    ファイルを読み取る前に、Test-Path コマンドレットを使用してファイルが存在するか確認することが良いプラクティスです:

    powershellCopy codeif (Test-Path $filePath) {
        # File exists, proceed with reading
    } else {
        Write-Host "File not found: $filePath"
    }
    
  1. ファイルを行単位で読み取る:

    ファイルが存在することを確認したら、[System.IO.File] クラスを使用してファイルを行単位で読み取ることができます。以下はそのためのコードです:

    powershellCopy codetry {
        $lines = [System.IO.File]::ReadLines($filePath)
        foreach ($line in $lines) {
            # Process each line here
            Write-Host $line
        }
    } catch {
        Write-Host "Error reading the file: $_"
    }
    

    このコードでは:

    • [System.IO.File] クラスの ReadLines メソッドを使用してファイルを行単位で読み取り、行を $lines 変数に格納します。
    • その後、foreach ループを使用して $lines 内の各行を反復処理します。この例では、単に Write-Host を使用して各行を表示していますが、望ましいアクションを実行できます。

完全な動作コード例

以下は、ファイルを行単位で読み取り、各行を表示する完全な動作コード例です:

powershellCopy code# Specify the path to the file
$filePath = "example.txt"

# Check if the file exists
if (Test-Path $filePath) {
    try {
        # Read the file line by line
        $lines = [System.IO.File]::ReadLines($filePath)
        foreach ($line in $lines) {
            # Process each line here
            Write-Host $line
        }
    } catch {
        Write-Host "Error reading the file: $_"
    }
} else {
    Write-Host "File not found: $filePath"
}

このコードでは:

  • $filePath 変数を使用してファイルのパスを指定します。
  • Test-Path を使用してファイルが存在するか確認します。
  • ファイルが存在する場合、[System.IO.File]::ReadLines() メソッドを使用してファイルを行単位で読み取り、foreach ループを使用して各行を処理します。
  • ファイルの読み取り中に発生する可能性のある例外をキャッチするエラーハンドリングを含めています。

PowerShell でファイルを行単位で読み取るための System.IO.StreamReader クラスを使用する

PowerShell で System.IO.StreamReader クラスを使用してファイルを行単位で読み取るには、以下の手順に従ってください:

  1. ファイルパスの指定:

    読み取るファイルのパスを指定することから始めます。"example.txt"をファイルの実際のパスに置き換えてください。

    powershellCopy code
    $filePath = "example.txt"
    
  2. ファイルが存在するか確認:

    ファイルを読み取る前に、Test-Path コマンドレットを使用してファイルが存在するか確認することが良いプラクティスです:

    powershellCopy codeif (Test-Path $filePath) {
        # File exists, proceed with reading
    } else {
        Write-Host "File not found: $filePath"
    }
    
  3. ファイルを行単位で読み取る:

    ファイルが存在することを確認したら、System.IO.StreamReader クラスを使用してファイルを行単位で読み取ることができます。以下はそのためのコードです:

powershellCopy codetry {
    $reader = [System.IO.StreamReader]::new($filePath)
    while ($reader.Peek() -ge 0) {
        $line = $reader.ReadLine()
        # Process each line here
        Write-Host $line
    }
    $reader.Close()
} catch {
    Write-Host "Error reading the file: $_"
}

このコードでは:

  • [System.IO.StreamReader]::new($filePath) を使用して System.IO.StreamReader の新しいインスタンスを作成します。ここで、$filePath はファイルのパスです。
  • while ループを使用してファイルを行単位で読み取ります。$reader.Peek() -ge 0 条件により、ファイルの終わりまで読み続けます。
  • ループ内では $reader.ReadLine() を使用して各行を読み取り、必要に応じて処理します。この例では、単に Write-Host を使用して各行を表示していますが、望ましいアクションを実行できます。
  • 最後に、ファイルリソースを解放するために $reader.Close() を使用して StreamReader を閉じます。

完全な動作コード例

以下は、ファイルを行単位で読み取り、各行を表示する完全な動作コード例です:

powershellCopy code# Specify the path to the file
$filePath = "example.txt"

# Check if the file exists
if (Test-Path $filePath) {
    try {
        # Create a StreamReader to read the file
        $reader = [System.IO.StreamReader]::new($filePath)

        # Read the file line by line
        while ($reader.Peek() -ge 0) {
            $line = $reader.ReadLine()
            # Process each line here
            Write-Host $line
        }
        
        # Close the StreamReader
        $reader.Close()
    } catch {
        Write-Host "Error reading the file: $_"
    }
} else {
    Write-Host "File not found: $filePath"
}

このコードでは:

  • $filePath 変数を使用してファイルのパスを指定します。
  • Test-Path を使用してファイルが存在するか確認します。
  • ファイルが存在する場合、System.IO.StreamReader インスタンスを作成してファイルを行単位で読み取ります。そして while ループを使用して各行を処理します。
  • ファイルの読み取り中に発生する可能性のある例外をキャッチするためのエラーハンドリングも含めています。

結論

要約すると、PowerShell はファイルを行単位で読み取るためのいくつかの柔軟な方法を提供しており、さまざまなスクリプトや自動化のニーズに対応しています。Get-ContentForEach ループは、単純なタスクに対する使いやすい選択肢であり、シンプルさと可読性を提供します。Get-ContentForeach-Object は柔軟性を高め、パイプライン内でより複雑な操作やフィルタリングタスクに適しています。

より高い制御と包括的なエラーハンドリングが必要なシナリオでは、[System.IO.File] クラスが強力なソリューションを提供します。この方法ではファイル操作を微調整し、エラーを優雅に処理できるため、堅牢でエラー耐性のあるスクリプトに適しています。

大きなファイルを処理し、メモリ効率が重要な場合は、System.IO.StreamReader クラスが優れています。これはファイルを効率的に読み取り、大量のデータセットのスムーズな処理を確保しつつ、メモリリソースをより効果的に管理します。

最終的に、使用する方法の選択は、特定のスクリプトの要件、ファイルサイズ、および処理の複雑性に依存します。これらの方法を利用することで、PowerShell でファイルを行単位で自信を持って読み取り、自動化ワークフロー内のさまざまなファイル関連のタスクに効果的に対処できます。

チュートリアルを楽しんでいますか? <a href="https://www.youtube.com/@delftstack/?sub_confirmation=1" style="color: #a94442; font-weight: bold; text-decoration: underline;">DelftStackをチャンネル登録</a> して、高品質な動画ガイドをさらに制作するためのサポートをお願いします。 Subscribe
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