【PowerShellのSort-Object】テキストファイルのProperty設定法

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る
                   

「テキストファイルをSort-Objectを使ってソートしようとしているんだけど、テキストファイルにはCSVファイルみたいにプロパティ名がないからPropertyを設定しての並び替えができない。どうやって実現すればいいのかわからなくて困っている…」という方向け。結論、テキストファイルでもSort-ObjectのPropertyを設定することができます。

スポンサーリンク

本記事は下記の5本立てです。

本記事の内容

  • テキストファイルのサンプル
  • テキストファイルのソート想定
  • 問題点
  • 【PowerShellのSort-Object】テキストファイルのProperty設定法
  • 【PowerShellのSort-Object】テキストファイルのソート結果

テキストファイルのサンプル

下記のような内容のテキストファイル『sample.txt』があったとしましょう。

B 2020/05/04 18:50 yellow red blue
C 2020/04/30 8:12 black
A 2020/03/01 21:34 white
A 2020/04/30 10:27 blue pink

各行の文字列は半角空白で区切ると、

  • 1列目:アルファベット1文字
  • 2列目:日付
  • 3列目:時間
  • 4列目以降:色

という並びになっている。

テキストファイルのソート想定

2列目『日付』の昇順に並び替えた後に、1列目『アルファベット1文字』で昇順に並べ替えたい。

PowerShellのプログラム実行結果としては下記の結果が欲しい。

A 2020/03/01 21:34 white
A 2020/04/30 10:27 blue pink
C 2020/04/30 8:12 black
B 2020/05/04 18:50 yellow red blue

問題点

テキストファイルのため、CSVファイルのようにファイルを読み込んだときにヘッダーをプロパティ名として設定してくれない。

そのため、Sort-Objectを使ってProperty設定をしたくてもプロパティ名がないのでどう設定すればいいのかわからない。

スポンサーリンク

【PowerShellのSort-Object】テキストファイルのProperty設定法

テキストファイルのSort-ObjectのPropertyは『{$_.split(“”)[0]}』という形で設定することができます。

実際の記述方法がこちら。

Get-Content "D:\PG\sample.txt" | Sort-Object -Property {$_.split("")[1]},{$_.split("")[0]}

splitで各行の文字列の分割指定を空白(””)に設定。

各行を空白で分割した場合、まず2つ目の列{$_.split(“”)[1]}で昇順にソートし、次に1つ目の列{$_.split(“”)[0]}で昇順にソートする。

…というのが、プログラムの解説です。

【PowerShellのSort-Object】テキストファイルのソート結果

ソート前とソート後の結果を表示するためのPowerShellのプログラムがこちら。

Write-Host "テキストファイルの中身"
Get-Content "D:\PG\sample.txt"
Write-Host "昇順ソート"
Get-Content "D:\PG\sample.txt" | Sort-Object -Property {$_.split("")[1]},{$_.split("")[0]}

このPowerShellのプログラム実行結果がこちら。

テキストファイルの中身
[B] 2020/05/04 18:50 red
[C] 2020/04/30 8:12 blue
[A] 2020/03/01 21:34 white
[A] 2020/04/30 10:27 blue
昇順ソート
[A] 2020/03/01 21:34 white
[A] 2020/04/30 10:27 blue
[C] 2020/04/30 8:12 blue
[B] 2020/05/04 18:50 red

ということで、テキストファイルのソートが実現できました^^

ファイル出力したい場合には、配列を使えばできますよ。

ではでは~ノシ

スポンサーリンク

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

SNSでもご購読できます。

コメントを残す

*