PowerShellでtailコマンドを実現する方法を知りたいときはないでしょうか。
けど、そんな中で悩むことは、
・PowerShellでtxt/csv/Excelファイルの末尾の行を取得する方法がわからない
ですよね。
今回はそんなお悩みを解決する
についてまとめます!
もくじ
PowerShellでtailコマンドを実現する方法
PowerShellでtailコマンドを実現する方法は、PowerShellには、tailコマンドに相当するコマンドレットとしてGet-Contentがありますので、このコマンドレットを使用します。また、末尾の行の指定については-Tailパラメータを使用してデータを取得しています。
PowerShellのGet-Contentの構文は?
PowerShellのGet-Contentの構文について説明をします。
PowerShellのGet-Contentは、PowerShellで使用できる標準のコマンドレットの1つで、ファイルの内容を読み込んで、行ごとに処理するために使用されます。
Get-Contentの構文です。
Get-Content [-Path] <string[]> [-Filter <string>] [-Include <string[]>] [-Exclude <string[]>]
[-ReadCount <Int64>] [-Delimiter <string>] [-TotalCount <Int64>] [-Tail <Int64>] [-Encoding <Encoding>]
[-Force] [-Raw] [-Stream <string>] [-Credential <PSCredential>] [<CommonParameters>]
構文の各パラメータと内容です。
パラメータ | 説明 |
---|---|
-Path | 読み込むファイルの場所を指定します。複数のファイルを指定することができます。 |
-Filter | ファイルのフィルタリングに使用されます。指定された文字列と一致するファイルのみが読み込まれます。 |
-Include | 読み込むファイルのリストを指定します。 |
-Exclude | 除外するファイルのリストを指定します。 |
-ReadCount | 読み込む行数を指定します。デフォルトでは、ファイル内のすべての行が読み込まれます。 |
-Delimiter | ファイル内の列を区切るために使用される区切り文字を指定します。 |
-TotalCount | ファイル内の行の総数を制限します。指定された数の行が読み込まれた後、Get-Contentコマンドレットは終了します。 |
-Tail | ファイルの末尾から指定された行数を読み込みます。 |
-Encoding | ファイルのエンコーディングを指定します。 |
-Force | ファイルが読み取り専用であっても、読み込むことができるようにします。 |
-Raw | 行末文字を無視してファイルを1つの文字列として読み込みます。 |
-Stream | 読み込むストリームの名前を指定します。例えば、ファイル内の特定のストリームを読み込むことができます。 |
-Credential | 認証情報を指定します。 |
Get-Content-Tailパラメータでtxtファイルの末尾の行を取得する
Get-Content-Tailパラメータでtxtファイルの末尾の行を取得してみましょう。
以下は、ファイルF:\test\list.txtの末尾3行を取得するサンプルコードです。
Get-Content F:\test\list.txt -Tail 3
list.txtの内容は以下の通りです。
商品A1
商品A2
商品A3
商品A4
商品A5
商品A6
商品A7
商品A8
商品A9
商品A10
結果です。
商品8
商品9
商品10
Get-Contentでcsvファイルの末尾の行を取得する
次にGet-Contentでtxtファイルの末尾の行を取得してみましょう。
以下は、ファイルF:\test\list.csvの末尾3行を取得するサンプルコードです。
Get-Content F:\test\list.csv | Select-Object -Last 3
Get-Contentコマンドレットを使用してCSVファイルの内容を取得し、Select-Objectコマンドレットを使用して、取得した行から最後の3行を選択します。
list.csvの内容は以下の通りです。
商品A1,100
商品A2,200
商品A3,300
商品A4,400
商品A5,500
商品A6,600
商品A7,700
商品A8,800
商品A9,900
商品A10,1000
結果です。
商品A8,800
商品A9,900
商品A10,1000
必要に応じて、Select-Objectコマンドレットを使用して、行から必要な列を選択することもできます。
まずは列項目を定義して一覧を出してみます。
Get-Content F:\test\list.csv | Select-Object -Last 10 | ConvertFrom-Csv -Header "商品","売り上げ" | Select-Object "商品","売り上げ"
結果です。
商品 売り上げ
---- --------
商品A1 100
商品A2 200
商品A3 300
商品A4 400
商品A5 500
商品A6 600
商品A7 700
商品A8 800
商品A9 900
商品A10 1000
次に2列目でかつ最終3行のみに絞り込んでみます。
Get-Content F:\test\list.csv | ConvertFrom-Csv -Header "商品","売り上げ" | Select-Object "売り上げ" -Last 3
結果です。
売り上げ
--------
800
900
1000
Excelファイルを読み込み、末尾の行を取得する方法
Excelファイルの最終行を取得する方法
Excelファイルを読み込み、最終行を取得する方法については別の記事にまとめていますので、こちらをご参考ください。
Excelファイルを読み込み、指定した列の末尾の3行を取得する
Excelファイルを読み込み、A列に絞り末尾の3行を取得するコードは以下の通りです。
$objExcel = New-Object -ComObject Excel.Application
$objWorkbook = $objExcel.Workbooks.Open('F:\test\list.xlsx')
$objWorksheet = $objWorkbook.Sheets.Item('Sheet1')
$intLastRow = $objWorksheet.Cells.SpecialCells(11).Row
$intStartRow = $intLastRow - 2
$data = @()
for ($i = $intStartRow; $i -le $intLastRow; $i++) {
$objRange = $objWorksheet.Range("A$i")
$data += $objRange.Value2
}
Write-Output $data
Excelファイルの構成は以下の通りです。
結果です。
商品A8
商品A9
商品A10
コードの説明
コードについて説明をします。
$objExcel = New-Object -ComObject Excel.Application
$objWorkbook = $objExcel.Workbooks.Open('F:\test\list.xlsx')
Excel.Applicationオブジェクトを作成しています。これは、Excelを自動化するためのオブジェクトであり、Excel.Applicationオブジェクトを作成することで、Excelの各種機能をPowerShellから利用できるようになります。
次にExcelファイルを開いています。ファイルのパスは’D:\test\フォルダ\対象ブック.xlsx’に指定されています。Excel.ApplicationオブジェクトのWorkbooksプロパティを使用して、対象のブックを開いて、オブジェクト変数$objWorkbookに格納しています。
$objWorksheet = $objWorkbook.Sheets.Item('Sheet1')
特定のワークシートを選択しています。Sheetsプロパティを使用して、対象のワークシートを取得し、Sheets.Item(‘Sheet1’)のように、ワークシート名で指定しています。選択したワークシートは、オブジェクト変数$objWorksheetに格納されます。
$intLastRow = $objWorksheet.Cells.SpecialCells(11).Row
選択されたワークシートの最終行を取得しています。CellsプロパティのSpecialCellsメソッドを使用して、最終行のセルを特定し、Rowプロパティを使用して、最終行の行番号を取得しています。この行番号は、整数値として、変数$intLastRowに格納されます。
$intStartRow = $intLastRow - 2
最終行から3行分のデータを取得するための開始行を計算しています。
最終行の行番号から2を引いた結果が、最終行から3行分のデータを取得するための開始行番号になります。
$data = @()
取得したデータを格納するための空の配列を作成しています。変数$dataには、後で取得したデータを追加していきます。
for ($i = $intStartRow; $i -le $intLastRow; $i++) {
$objRange = $objWorksheet.Range("A$i")
$data += $objRange.Value2
}
Write-Output $data
最終行から3行分のデータを1行ずつ取得しています。forループを使用して、最終行から開始行までの各行に対して処理を行っています。
forループが終わったら結果をコマンドラインへ出力します。
さいごに
いかがでしょうか。
今回は、
についてまとめました。
また、他にも便利な方法がありますので、よろしければご参照頂ければと思います。
コメントを残す