雑記+備忘録

OS中心の技術情報と趣味について(最近は主に将棋)。備忘録なのでここに書かれたことを試すのは自己責任でお願いします。

csvデータを取り込んでExcelで折れ線グラフを生成するPowerShell

PowerShellで以下を実現する文の紹介としてサンプルプログラムを作成しました。
Excelのセルに値を入れる
Excelのグラフ(折れ線グラフ)を作成
PowerShellExcelを扱う際の「Cells」の使い方

# 
# csvからExcelでグラフを生成するPowerShell
# 
########## 値を変更する変数 ##########

# Excelファイル名
$fileName = "Test.xlsx"

# Excelシート名
$sheetName = "Test"

## 情報CSVファイル名
$csvFName = "Test.csv"

######################################


# ファイルのパスを取得
$scriptPF = $MyInvocation.MyCommand.Path
$scriptPath = Split-Path -Parent $scriptPF

$flExcelPF = $scriptPath + "\" + $fileName

# Excelファイルが存在する場合に処理
if (Test-Path $flExcelPF) {

  # Excelのオープン
  $objExcelAp = New-Object -ComObject Excel.Application
  $objExcelAp.Visible = $true

  $objExcelBook = $objExcelAp.Workbooks.Open($flExcelPF)

  $objExcelSheet = $objExcelBook.Worksheets.Item($sheetName)

  # データを取り込み、編集
  ## CSVファイル読み込み
  $headerStr = "ddf01,ddf02,ddf03,ddf04,ddf05"
  $headerSplit = $headerStr -split ","
  $csvObj = Get-Content $csvFName | ConvertFrom-Csv -Header $headerSplit

  ## 初期値、先頭行設定
  $nCount = 1
  $objExcelSheet.Cells.Item(2, 1) = "No."
  $objExcelSheet.Cells.Item(2, 2) = "Score"

  ## CSV1件ごとに処理
  $csvObj | ForEach-Object {

    ## データ編集
    $objExcelSheet.Cells.Item(2 + $nCount, 1) = $nCount
    $objExcelSheet.Cells.Item(2 + $nCount, 2) = $_.ddf03

    $nCount++

  }

  # データをグラフ化
  $strRange = "A2:B" + (1 + $nCount)
  $dataRange = $objExcelSheet.Range($strRange)

  $chartObjects = $objExcelSheet.ChartObjects()

  $newChartObject = $chartObjects.Add(120, 10, 700, 300)

  $MyChart = $newChartObject.Chart
  $MyChart.ChartType = 4
  $MyChart.SetSourceData($dataRange)
  $MySeries = $MyChart.SeriesCollection(1)
  $MySeries.Delete() | Out-Null

  # ファイルの保存、閉じてExcelの終了
  $objExcelBook.Save()

  $objExcelAp.Quit()

  # プロセスの解放
  .{
     [System.Runtime.Interopservices.Marshal]::ReleaseComObject($MyChart)
     $MyChart = $null
     [System.Runtime.Interopservices.Marshal]::ReleaseComObject($newChartObject)
     $newChartObject = $null
     [System.Runtime.Interopservices.Marshal]::ReleaseComObject($chartObjects)
     $chartObjects = $null
     [System.Runtime.Interopservices.Marshal]::ReleaseComObject($objExcelSheet)
     $objExcelSheet = $null
     [System.Runtime.Interopservices.Marshal]::ReleaseComObject($objExcelBook)
     $objExcelBook = $null
     [System.Runtime.Interopservices.Marshal]::ReleaseComObject($objExcelAp)
     $objExcelAp = $null
   } | Out-Null

  # ガベージコレクトの明示実行
  [GC]::Collect()
  [GC]::WaitForPendingFinalizers()
  [GC]::Collect()

}

csvファイルの項目名「ddf01~ddf05」は、現行システム(個人的に趣味で作成した)のデータが5つ項目を持っていて、
3番目の「点数」をグラフ化したかったのでこのような構成になっています。
横軸もただのナンバリングです。

ChartType = 4については以下のURLを参考に設定しています。(ありがとうございます)
http://officetanaka.net/excel/vba/graph/06.htm

PowerShellで折れ線グラフ生成」は元々他のフリーで公開されているツールと組み合わせて実現していたのですが、
パソコンを買い替えたときにそのツールを再設定するのが面倒になって、
自分のパソコンライフスタイル上ほぼ確実に入れることになるExcelでやる方針にしました。

年始の目標チェック

2017年も3/4が終わったので、年始に立てた目標のチェックをします。
「年間エントリー数35以上」

 

今の時点(年間の3/4)で27のペースが必要なのでクリア。
このままのペースでいくと達成。この調子でいこう。
仕事が落ち着き、徐々に時間もできてきました。

 

あと3か月、指す将順位戦ネタと技術ネタが中心になりそう。
毎年チェックしている市川市将棋大会ももうすぐです。

財布から小銭がなくなった

しょーもない話ですが、今日昼の弁当を買ったら金額がちょうど財布にあった小銭と一致したため、
「財布の中に小銭が全くない」という個人的にはなかなかにレアな状態となりました。

 

仕事帰りに某ドラッグストアで日用品を買ったらおつりが発生し、
再び財布に小銭が。「小銭がない」期間はおよそ8時間で終了。

 

今や電子マネーもあるので、もう少し記録を長引かせられると思ったのですが、
意外と短時間でした。

フォルダの所有権を得る

・管理者ユーザーで、特定ユーザーのプロファイルフォルダを全削除したい
・アクセス権を変更したい
などの目的で、フォルダの所有権を得るためのコマンドです。
いつものPowerShellではなく「takeown」コマンドを使います。

takeown /f "<フォルダのパス>" /r /d Y

オプションの意味は以下の通り(他にもオプションはありますが、よく使う組み合わせが上記です)

/f <フォルダ名もしくはファイル名フルパス> ・・・ 対象となるフォルダ、ファイルの指定
/r ・・・ フォルダ内のすべてのサブフォルダ、ファイルを再帰的に実行
/d Y ・・・ 確認メッセージに対して「はい」を自動的に返してくれる


これで所有者を自分にしてからフォルダの削除を試みます。
それでも残る場合は、
個別にそのフォルダのプロパティからアクセス権設定を開いて、
「子オブジェクトのアクセス許可エントリすべてを、このオブジェクトからの継承可能なアクセス許可エントリで置き換える」
をチェックすることでアクセス権を配下全てに継承させてから
再度削除を試みると削除できました。

残留争い

指す将順位戦、5戦を終えて1勝4敗。
リーグ参加者のレートをふまえるとまあ順当な中間結果といえます。
今回の目標はあくまでも「全局指すこと」なのですが、
一応順位も気にしてみます。
目下、このままでは次期降格、いわゆる「ネタ将」一直線です。
それを回避できるよう、現在の組に残れるように一つでも勝ち星を積んでいく、
「残留争い」を繰り広げるわけです(降格争い、ではない)。

Jリーグでよく聞く用語ですが、あちらはプロであり生活がかかっているので、
無論、同じなどとは言えません。
それでも趣味とはいえ「残留争い」に参入する経験は数少ないと思いますので、
この気分を噛みしめつつ1局1局雑にならないように指そうと思います。

ところで再度の8連敗でRが300台に・・・
フリーで対局してもらう調整を多くしなければならなさそうです。

指す将順位戦途中経過

2戦、1勝1敗。とりあえず一つ勝てて良かった~。
しかし同組の他の人の対局を観戦して違和感が…

 

初級タブではありません

 

何か皆さんRが高め。そこで今回対局する相手の現在のRを調べてみると…
自分 R425 に対し、

486 ●
539 ○
747
1074
475
719
762
688
589
867
697

 

ひょえ~、一つ勝てて良かったどころか全敗じゃなくて良かったといったレベル。
強い相手にぶつかっていけるのはありがたいので、これからも一戦一戦楽しんでいきます。
何か特別なことをしようにもここのところ仕事もプライベートも忙しく時間も気力もないので普段通りで。

PowerShellスクリプトをタスクスケジューラで実行する設定

他でも載っている情報ですが、忘れやすいのでメモ。

(例)「C:\test」内の「hoge.ps1」を 「引数1:localhost 引数2:start」で実行する場合

<操作タブ「プログラムの開始」>

プログラム/スクリプト

%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe

引数の追加(オプション)

-Command "C:\test\hoge.ps1 localhost start"

開始(オプション)

C:\test

「開始(オプション)」は実行時のワークディレクトリとなります。 ここはダブルクォートでは囲まないので注意。

実行ポリシーを一時的に変える場合は「引数の追加」が以下の通りとなります。(未検証。引数の設定方法は違うかも)

-ExecutionPolicy RemoteSigned -File "C:\test\hoge.ps1 localhost start"