PowerShellで1行ずつ処理する方法:基礎と応用
この記事では、PowerShellでテキストやファイルを1行ずつ読み込み、処理する方法について説明します。
まず、基本的な文法に沿ったシンプルな手法を紹介し、続いて条件に応じたフィルタ処理や変数操作など、実践的な応用例も取り上げます。
初心者でも理解しやすい内容となっておりますので、作業効率向上にぜひお役立てください。
基礎編:1行ずつ処理の基本
PowerShellでの行単位処理の仕組み
PowerShellでは、テキストファイルを1行ずつ読み込み、各行を個別に処理できる仕組みが用意されています。
ファイル全体を一度に読み込むのではなく、行ごとに処理を行うことで、大きなファイルでもメモリ効率よく扱うことができます。
また、パイプラインを利用することで、複数の処理を連携させることが可能です。
使用する主要なコマンドレット
Get-Contentによる行読み込み
Get-Content
コマンドレットは、ファイルの内容を行単位で取得するために使用されます。
ファイル内の各行が配列の要素として返されるため、ループ処理などで個々の行に対して操作を実施できます。
以下はサンプルコードです。
# sample.txtの内容を1行ずつ取得する
$lines = Get-Content -Path "sample.txt"
# 行ごとに内容を表示する
foreach ($line in $lines) {
Write-Output $line
}
Line 1 of sample.txt
Line 2 of sample.txt
Line 3 of sample.txt
...
ForEach-Objectによる各行の処理
ForEach-Object
コマンドレットは、パイプラインから渡された各オブジェクト(この場合は行)に対して処理を実施する際に非常に便利です。
シンプルな記述で、行ごとに同じ処理を連続して行う処理が書けます。
# sample.txtの各行を順に処理し、行番号と共に出力する
$i = 1 # 行番号の初期値
Get-Content -Path "sample.txt" | ForEach-Object {
# 各行に対して行番号と行の内容を出力する
Write-Output "Line $i: $_"
$i++
}
Line 1: Line 1 of sample.txt
Line 2: Line 2 of sample.txt
Line 3: Line 3 of sample.txt
...
ファイル操作による具体例
テキストファイルの読み込みとデータ格納
テキストファイルからデータを読み込み、簡単なデータ操作をする場合、読み込んだ行を配列や変数に格納して後から再利用することができます。
以下の例では、ファイルの内容を配列に格納し、後でその配列から特定のデータを抽出しています。
配列や変数を用いた行の管理
Get-Content
で読み込んだ行は変数に代入できるため、一時的なデータ保持や後続処理に利用しやすくなっています。
例えば、すべての行を配列 $lines
に格納して後でループ処理をする方法を示します。
# sample.txtからすべての行を配列に格納する
$lines = Get-Content -Path "sample.txt"
# 配列内の各行を出力する処理
foreach ($line in $lines) {
Write-Output $line
}
Line 1 of sample.txt
Line 2 of sample.txt
Line 3 of sample.txt
...
条件を用いた行の抽出と分岐処理
ファイルの各行に対して条件判定を行い、特定の文字列を含む行だけを抽出することも可能です。
以下の例は、行内に「Error」という文字列が含まれる場合のみ、エラーメッセージとして出力する処理です。
# sample.txtの各行をチェックし、「Error」を含む行だけを抽出する
Get-Content -Path "sample.txt" | ForEach-Object {
if ($_ -match "Error") {
Write-Output "エラー発生箇所: $_"
}
}
エラー発生箇所: [Error] Line with error message
応用編:実践的な1行処理の活用方法
複数ファイルの同時処理
パイプラインを利用した連携処理
複数ファイルを一括で処理する際、Get-ChildItem
や ForEach-Object
を組み合わせることで、効率よく処理を実現できます。
以下のサンプルコードでは、指定したディレクトリ内のすべてのテキストファイルを対象に、各ファイルの内容を行ごとに読み込んで出力しています。
# 現在のディレクトリ内のすべての.txtファイルを取得し、内容を1行ずつ処理する
Get-ChildItem -Path . -Filter "*.txt" | ForEach-Object {
$file = $_.FullName
Write-Output "----- $file -----" # ファイル名の出力
Get-Content -Path $file | ForEach-Object {
Write-Output $_
}
}
----- C:\path\to\file1.txt -----
Content line 1 from file1.txt
Content line 2 from file1.txt
...
----- C:\path\to\file2.txt -----
Content line 1 from file2.txt
Content line 2 from file2.txt
...
エラーハンドリングを含む動的な処理制御
例外発生時の対応方法と処理の分岐
実際のスクリプトでは、ファイルが存在しない場合やアクセスできない場合などに対して例外発生が懸念されます。
PowerShellでは、try-catch
構造を用いることで、こうした例外に対する処理を記述することが可能です。
下記のサンプルコードは、ファイルの読み込み処理でエラーが出た場合に、エラーメッセージを出力する例です。
# ファイル読み込みを試み、エラーが発生した場合はcatchブロックで処理する
try {
$lines = Get-Content -Path "nonexistent.txt" -ErrorAction Stop
# 各行を表示
foreach ($line in $lines) {
Write-Output $line
}
} catch {
# エラー発生時の処理: エラーメッセージを出力する
Write-Output "指定したファイルが存在しないか、アクセスできません。"
}
指定したファイルが存在しないか、アクセスできません。
まとめ
この記事では、PowerShellを使ってテキストファイルの各行を効率的に処理する方法を紹介しました。
Get-ContentとForEach-Objectを用いた基本的な行読み込みや処理、配列への格納、条件指定での行の選別、複数ファイルの連携処理や例外発生時のエラーハンドリングなど、実用的なサンプルコードを交えながら解説しています。
これにより、初歩から応用まで幅広いスクリプト作成の参考となります。