2020年8月30日日曜日

bash ファイル名に半角スペースが入っているファイル一覧の取得

シュルはループをしなくても下記の例のように、ファイル一覧から、ファイル名をパラメーターにして、自分のプログラムに渡して順番に実行することができます。まあ、一番いい方法かどうかは置いといて、やりたいことができるならわるくないとは思います。

#!/bin/bash

TD=/tmp/all2mp4-$$

ls -l ~/myfiles/*.anyext | awk '{print "bash ~/myprogram.sh " gsub(/ /,"\\ ",$9)}'> $TD

bash $TD

sleep 1

rm $TD

しかし、ファイル名にスペースが入っている場合、上記のawkからちゃんとファイルを取得することができなかったので、下記に書き直しました。それから、自分のプログラムに渡した場合、スペースを¥(バックスラッシュ)でエスケープしないとちゃんとパラメーターとして渡せない点を注意する必要がありますね。

#!/bin/bash

TD=/tmp/all2mp4-$$

 ls -l ~/myfiles/*.anyext | awk '{tmp=$1;for (i = 2; i <= 8; i++) tmp=tmp " " $i;gsub(" "," ",$0);gsub(tmp " ","",$0); gsub(" ","\\ ",$0); print "bash ~/myprogram.sh " $0}'> $TD

bash $TD

sleep 1

rm $TD

【註】$$ 実行されたシェル自身のプロセスIDです。

(日付が一桁のとき、2連スペースになるため、2連スペースを一つスペースに置換する修正しました)

 

2020年8月28日金曜日

DPC公開データのクレンジング(汎用性のある横持ち表を縦持ちデータに変換するツールとしてのつもり^^;)

 厚労省が公開したデータがいけていない(さらに複雑な分析ができない)からDPC公開データのクレンジングのためにExcel のVBAプログラミングで簡単なツールを作りました。

https://www.mhlw.go.jp/stf/shingi2/0000196043_00003.html

抽出手順
1.データの範囲を検知(行数、列数)
2.表頭を値として取得
3.値が2種類(件数、在院日数。8/4=2)があるから同時に2列を書き出す
4.次の表頭グループからデータを抽出

Excelファイルを下記からダウンロードできます。

 Excel xlsm

公開するか未定ですが、自動的に厚労省のURLからダウンロードして、表側と表頭を自動的に判別してCSVに吐き出すか、データベースに入れる拡張をする予定です。

Excel VBAワークシートActiveせずにCellの行番と列番で範囲コピペ

 ワークシートを配列(左からのワークシートの順番)か、あるいはワークシート名で指定し、コピー元を特定できる

Range(Worksheets(1).Cells(1, 1), Worksheets(1).Cells(6, 6)).Copy

貼り付け先もRange(cells(1,1),Cells(6,6)).Addressで行番と列番で指定できる

(1) 配列指定

Worksheets(3).Paste Destination:=Worksheets(3).Range(Range(Cells(1, 1), Cells(1, 100)).Address)

(2) ワークシート名指定
Worksheets(“出力”).Paste Destination:=Worksheets(3).Range(Range(Cells(1, 1), Cells(1, 100)).Address)

(3) ワークシートのオブジェクト名指定

Sheet4.Paste Destination:=Worksheets(3).Range(Range(Cells(1, 1), Cells(1, 100)).Address)