寝ても覚めてもこんぴうた

プログラム書いたり、ネットワーク設計したり、サーバ構築したり、車いじったり、ゲームしたり。そんなひとにわたしはなりたい。 投げ銭は kyash_id : chidakiyo マデ

Power Shellでヘッダーが重複したCSVを読み込む

なんか最近PowerShellを書いてます。こんにちは。

PowerShellには Import-Csv という便利なライブラリがいるんですが、ヘッダの値がそのままオブジェクトのプロパティになってしまうため、ヘッダーに重複した値があるとエラーが発生して読み込めません。

よしなにやってくれると嬉しいんですが、そのようなオプションがない(と思う)ので、頑張って解決してみます。

アプローチ

  • ヘッダ行を取得する。
  • 重複するヘッダがあった時にヘッダの別名を生成する

という感じでユニークなヘッダのデータを作成し、 Import-Csv に対し -Header オプションで渡します。めんどいですね。

コード

# csvファイルをShift-JISで読み込む
$StreamReader = New-Object System.IO.StreamReader("C:\data.csv", [Text.Encoding]::GetEncoding("Shift-JIS"))

# ヘッダをカンマ区切りでsplitし取得する
$Headers = $StreamReader.ReadLine() -Split "," | % { "$_".Trim() } | ? { $_ }

# 重複したヘッダは別名を付ける
For ($i=0; $i -lt $Headers.Count; $i++) {

    if ($i -eq 0) { Continue } # 最初のカラムはスキップ

    if ($Headers[0..($i-1)] -contains $Headers[$i]) {
        $Headers[$i] = "Header$i" # 個々のフォーマットで欲しいヘッダの形に
    }
}

# csvファイル読み込み
$csv = Import-Csv "data.csv" -Delimiter "," -Encoding Default -Header $Headers

$csv # output

2回もファイル読むの虚しいけど、こんな感じ。

まとめ

参考

Dealing with duplicate headers in .csv files in Powershell - Stack Overflow

Set-ExecutionPolicy RemoteSignedを実行するにはPowerShell自体を管理者権限で実行する必要がある

> Set-ExecutionPolicy RemoteSigned

とコマンド実行した際に

Set-ExecutionPolicy : レジストリ キー 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell' へのアクセスが拒否されました。 既定 (LocalMachine) のスコープの実行ポリシーを変更するには、[管理者として実行] オプションを使用して W
indows PowerShell を起動してください。現在のユーザーの実行ポリシーを変更するには、"Set-ExecutionPolicy -Scope CurrentUser" を実行してください。

のようなエラーが発生してうまくいかない。
これはPowerShell自体をユーザ権限で起動しているため。

管理者権限でPowerShell自体を実行し直すことで問題なくコマンドの実行ができるようになる。

PowerShellでdllのロードに失敗する

PowerShellでImport-Moduleをしたところ、

ファイルまたはアセンブリ '~~~~~~~~~~~~~~~~~~~~'、またはその依存関係の 1 つが読み込めませんでした。操作はサポートされません。

のようなエラーメッセージが発生し、うまくスクリプトの実行ができない。
importしているパスの場所にファイルも存在するし、PowerShell ISEでもちゃんと補完されている。

なぜだろうとしばらく悩んだ結果、
今回importしようとしていた UIAutmation のモジュールの zip をダウンロードする際に、Windows標準の機能を使うとダメみたい。

なので、Explzh というツールを用いて、しかも、設定の中の「解凍オプション」>「基本設定」の中にある

NTFSのZoneIDを維持して展開

f:id:chidakiyo:20171019162618p:plain

のチェックを はずす 必要がある。

その状態で解凍したzipのモジュールで再実行したところ問題なく動作した。

UiPath Community EditionでActivation Errorが出る

UiPath studioを起動しようとした際に Activation Error Server License Expired のようなエラーが発生する場合、 コミュニティエディションは2ヶ月おきにアクティベーションをする必要があるので、以下のリンクから情報を入力すれば問題なくActivationが出来るようになる。

Community License - Renew

Macのhomebrewでgoのupdateを行ったらエラーが発生する。

そろそろ新しいgoが入るかなと思い、 brew update;brew upgrade コマンドを実行したところ、go1.9がインストールされたので、既存のプロジェクトのテストを試しに実行してみたところ以下のようなエラーが発生した。

flag provided but not defined: -goversion

原因を調べてみたところ、 go env を実行した際に GOROOT の向き先がgo 1.8のディレクトリになっている。

環境変数などは設定した覚えがないので、おそらくインストールしたgoが持っているパラメータなんだろうと思ったけど、これでは使いものにならないので、

export GOPATH=export GOROOT=/usr/local/Cellar/go/1.9/libexec/

という感じで環境変数にセットして実行したところ問題なく治った。 updateした時にまた影響がありそうなので、そのうち修正されたら .zshrc などに設定した上の値は消したいので備忘。

Bigquery (Legacy SQL) でUTC→JST変換するクエリ

BigqueryにはUTCで値が入っているので、JSTに変換して取得する際によく忘れるので備忘。

時分秒まで取得したい場合

STRFTIME_UTC_USEC(TIMESTAMP_TO_USEC(p.createdAt) + 32400000000, "%Y/%m/%d %H:%M:%S")

日付でGroup byなどする場合

STRFTIME_UTC_USEC(TIMESTAMP_TO_USEC(p.createdAt) + 32400000000, "%Y/%m/%d")

フォーマットの違いだけなので書く必要なかったかな・・(´・ω・`)