or1ko's diary

日々を書きます

月ごとのデータをよこ軸に集計する方法

たまに下記のような、月ごとのデータを

name mouth count
Tom 5 2
Jhon 6 3
Tom 6 3

下記のように変換して、
月の遷移を確認したくなることがある。

name 5 6
Tom 2 3
Jhon 0 6

そういう場合は、Group-Objectを使うと便利

PS > $table = [PSCustomObject]@{name="Jhon";mouth=5;count=2},
[PSCustomObject]@{name="Tom" ;mouth=6;count=3},
[PSCustomObject]@{name="Jhon";mouth=6;count=3}

PS > $table

name mouth count
---- ----- -----
Jhon     5     2
Tom      6     3
Jhon     6     3

PS > $table | Group-Object -Property name |
% {
    $a = [PSCustomObject]@{name=$_.name}
    $_.Group | % {
        $a | Add-Member -NotePropertyMembers @{$_.mouth=$_.count}
    }
    $a
}

name 5 6
---- - -
Jhon 2 3
Tom    3

WebページからBodyのテキストを取得する方法

PowerShellでスクレイピング 後編 HTMLをパースする - PowerShell Scripting Weblog

下記の記事で見つけた。
Invoke-WebRequestの結果は、
IEで解析されBody要素のDOMを扱えるとのことなので、
下記の通りすると、できる

$contents = Invoke-WebRequest $url
$contents.ParseHtml.body.innerText

PowerShellすごいなー。

Invoke-RestMethodの文字化け対策

gooラボ 形態素解析APIを試してみる - pierre3のブログ

上のブログに記載されてました。
Invoke-RestMethodは諦めて、下記のようにInvoke-WebRequestを使うようです。

$res = Invoke-WebRequest -Method Post $url -Body $body
$con = [System.Text.Encoding]::Utf8.GetString([System.Text.Encoding]::GetEncoding("ISO-8859-1").GetBytes($res.Content))
#JSONの場合は下記のように変換する
ConvertFrom-Json $con 

transparentネットワークを使う方法

デフォルトで存在するnatネットワークを使って、-pオプションでポートを指定して、
EXPOSEも設定したのだが、うまくつながらなかった。
色々調べたけれど、さっぱりわからなかった。
natにこだわりがあるわけでないので、
natでなくて、物理ネットワークをそのままつなげる方法を
試したところ、うまくいったので、その方法をメモする。

・まずは、transparentのネットワークを作成

docker network create -d transparent transparent

・そのネットワークを指定して起動する

docker run --net=transparenet ... <省略>

この方法に切り替えて、すぐにできたので、はよ切り替えればよかった。

下記を参考にした。
Windows コンテナーのネットワーク | Microsoft Docs

Excelファイルの操作(ImportExcel)

以前よりCOMを使ったexcelの操作方法は知っていたのだが、
覚えられるほど簡単ではなかったのであまり使かうことはなず、
csvファイルで出力し、手作業でxlsやxlsxファイルに変換することが多かった。

先日、PowerShellGetの存在をしり、ImportExcelという
モジュールが提供されていることを知って、結構気になっていて、
調べてみることにした。

PowerShell Gallery | ImportExcel 3.0.1

  • gciの結果をexcelファイルへエクスポート
gci | excel-export test.xlsx

期待通りに出力される。

以上

csvの2つ以上の列が同じ行を除去する方法

get-uniqueでプロパティを指定できたら良かったのですが、
できないので、一度、重複判定するための列を追加して、
sort-objectを-uniqueを呼び出して、除去する。

ConvertTo-*コマンドの動作

ConvertTo-で始まるPowerShellのコマンドはいくつかあるので、動作確認結果。
ConvertTo-Xmlはちょっとだけ期待はずれ。
最初はcsv

> ([PSCustomObject]@{id=1;name="Jhon"},[PSCustomObject]@{id=2;name="Tom"}) | ConvertTo-Csv
#TYPE System.Management.Automation.PSCustomObject
"id","name"
"1","Jhon"
"2","Tom"

次にjson

> ([PSCustomObject]@{id=1;name="Jhon"},[PSCustomObject]@{id=2;name="Tom"}) | ConvertTo-Json
[
    {
        "id":  1,
        "name":  "Jhon"
    },
    {
        "id":  2,
        "name":  "Tom"
    }
]

XML。デフォルトはxmlのオブジェクトになってしまうのでstringで出力。型情報も除去する。
Propertyでなく、idやnameにしたいが、方法は分からなかった。

> ([PSCustomObject]@{id=1;name="Jhon"},[PSCustomObject]@{id=2;name="Tom"}) | ConvertTo-Xml -As string -NoTypeInformation
<?xml version="1.0" encoding="utf-8"?>
<Objects>
  <Object>
    <Property Name="id">1</Property>
    <Property Name="name">Jhon</Property>
  </Object>
  <Object>
    <Property Name="id">2</Property>
    <Property Name="name">Tom</Property>
  </Object>
</Objects>

ちなみにHTMLは下記の通り。

> ([PSCustomObject]@{id=1;name="Jhon"},[PSCustomObject]@{id=2;name="Tom"}) | ConvertTo-Ht
ml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>HTML TABLE</title>
</head><body>
<table>
<colgroup><col/><col/></colgroup>
<tr><th>id</th><th>name</th></tr>
<tr><td>1</td><td>Jhon</td></tr>
<tr><td>2</td><td>Tom</td></tr>
</table>
</body></html>