2017年3月26日

【PowerShell】MP3ファイルのタグ情報を表示してみる(ソート有り)


昨日の「MP3ファイルのタグ情報を表示してみる」から、さらにソートしてみました。

GetMp3Info_Sort.ps1
$sh = New-Object -ComObject Shell.Application
$music = "C:\work\mp3"
$folder = $sh.Namespace($music) 
$items = Get-ChildItem -Path $music -Include *.mp3 -Name

#空の配列を定義
$array = @()

foreach($f in $items)
{
    $fi = $folder.ParseName($f)

    $num = $folder.GetDetailsOf($fi,26).PadLeft(2,"0")
    $title = $folder.GetDetailsOf($fi, 21)
    $time = $folder.GetDetailsOf($fi, 27)
    $size =  $folder.GetDetailsOf($fi,1)

    #ジャグ配列に格納
    $array += ,@($num, $title, $time, $size)
}

Write-Host "■ソート前"
Write-Host "トラック番号   タイトル   長さ   ファイルサイズ" 
Write-Host "----------------------------------------------"

for($i = 0; $i -lt $array.Count; $i++)
{
    $rec = ""
    for($j = 0; $j -lt $array[$i].Count; $j++)
    {
        $work = [string]$array[$i][$j]
        $rec = $rec + $work + " "
    }
    Write-Host $rec
}

#ソート(バブルソート)
for($i = 0; $i -lt ($array.Count - 1); $i++)
{
    for($j = ($array.Count - 1); $j -gt $i; $j--)
    {
        if ($array[$j - 1][0] -gt $array[$j][0])
        {
            $tmp = $array[$j - 1]
            $array[$j - 1] = $array[$j]
            $array[$j] = $tmp
        }
    }
}

Write-Host ""
Write-Host "■ソート後"
Write-Host "トラック番号   タイトル   長さ   ファイルサイズ" 
Write-Host "----------------------------------------------"

for($i = 0; $i -lt $array.Count; $i++)
{
    $rec = ""
    for($j = 0; $j -lt $array[$i].Count; $j++)
    {
        $work = [string]$array[$i][$j]
        $rec = $rec + $work + " "
    }
    Write-Host $rec
}


実行結果
■ソート前
トラック番号   タイトル   長さ   ファイルサイズ
----------------------------------------------
10 4 Real 00:03:28 5.41 MB 
12 Alice (Extended Version) 00:05:00 6.85 MB 
19 Bad Reputation 00:02:42 4.42 MB 
01 Black Star 00:01:34 2.16 MB 
11 Darlin 00:03:50 5.73 MB 
08 Everybody Hurts 00:03:41 5.80 MB 
14 Goodbye 00:04:32 6.05 MB 
07 I Love You 00:04:01 6.24 MB 
18 Knockin' On Heaven's Door 00:02:52 3.38 MB 
09 Not Enough 00:04:18 6.25 MB 
16 Push (Acoustic) 00:02:46 4.37 MB 
03 Push 00:03:01 4.82 MB 
13 Remember When 00:03:29 5.37 MB 
05 Smile 00:03:29 5.05 MB 
06 Stop Standing There 00:03:27 5.19 MB 
15 What The Hell (Acoustic) 00:03:40 5.57 MB 
02 What The Hell 00:03:40 5.15 MB 
17 Wish You Were Here (Acoustic) 00:03:45 5.45 MB 
04 Wish You Were Here 00:03:45 5.52 MB 

■ソート後
トラック番号   タイトル   長さ   ファイルサイズ
----------------------------------------------
01 Black Star 00:01:34 2.16 MB 
02 What The Hell 00:03:40 5.15 MB 
03 Push 00:03:01 4.82 MB 
04 Wish You Were Here 00:03:45 5.52 MB 
05 Smile 00:03:29 5.05 MB 
06 Stop Standing There 00:03:27 5.19 MB 
07 I Love You 00:04:01 6.24 MB 
08 Everybody Hurts 00:03:41 5.80 MB 
09 Not Enough 00:04:18 6.25 MB 
10 4 Real 00:03:28 5.41 MB 
11 Darlin 00:03:50 5.73 MB 
12 Alice (Extended Version) 00:05:00 6.85 MB 
13 Remember When 00:03:29 5.37 MB 
14 Goodbye 00:04:32 6.05 MB 
15 What The Hell (Acoustic) 00:03:40 5.57 MB 
16 Push (Acoustic) 00:02:46 4.37 MB 
17 Wish You Were Here (Acoustic) 00:03:45 5.45 MB 
18 Knockin' On Heaven's Door 00:02:52 3.38 MB 
19 Bad Reputation 00:02:42 4.42 MB 

ソートするにはやはりトラック番号の比較が出来ないといけないので、とりあえず取得したデータをジャグ配列に格納してみました。

ソートは、単純にバブルソートで並び替えてます。
速度のことを考えればクイックソートがいいと思いますが、この程度の要素数ならバブルソートで十分です。

あとは、クラスを作ってListでソートすればもっとすっきり出来そうな気もしますが・・・、それはまたいずれ。



スポンサーリンク