テキストファイルから指定した文字列を含む行を抽出するVBScript
2021年04月24日
ログファイルからハードウェア故障の有無を調べることがある。
何度も何度もキーワードを変えて検索を繰り返すのはくそだりぃので
該当の文字列を含む行だけ抽出するVBScriptを作ってみた。
簡単にできるだろと高を括っていたけど、意外にも苦戦。
なんとか想定した2時間で完成。
ん・・・。
ログファイルってUTF8の可能性もあるよな。。。
で、作り直し。
VBScriptでUTF8のファイル読み込みで検索したら、神がかったサイトを発見。
https://neos21.net/blog/2016/03/25-01.html
UTF-8 テキストを読み込み、同じ内容をUTF-8テキストで書き込むサンプル。
読み込みと書き込みの間に文字列を比較する処理を追加して完成。
趣味プログラミングでは、流用しやすいソースを見つけられるかで全然工数が違う。
自分でVBAで同じようなことやったのに、ググった方が早いだなんて。。。
◆使用方法◆
ソースをメモ帳にコピーし、「.vbs」形式で保存。
ログファイルを保存したファイルのアイコンにドラッグドロップする。
(複数ファイルにも対応)
ログファイルの文字コードに合わせて設定を変えなきゃいけないのはめんどいな。
以下、ソース。
PR
近似matchを使用したドライブの使用量推移グラフ
2021年04月23日
前回、各行での総和計算でエクセルがフリーズして困った。
今回はその対策についての紹介。
対象のデータは前回と同じ。
・CドライブとDドライブを解析した結果が各シートに出力されている。
・データはD列の更新日時昇順にソートされており、E列のファイルサイズが集計対象。
DIRコマンドの詳細は過去の記事を参照。
ファイル一覧解析マクロ
まず集計用のシートを追加し、作成したいグラフに合わせて
B列にX軸となるデータ列を作成。
C列、D列は、match関数で対象の日時が何行目に該当するか検索。
検索対象のデータを昇順にソートしたうえで照合の種類を1に設定することで、
検索値を超えない最大値の行数が返ってくる。
例:C4=MATCH(B4,dir_c.txt!$D$1:$D$170037,1)
1行目から該当行までのファイルサイズを合計することで、
ドライブの使用量を算出する。
参照先を可変にする場合は、indirect関数を使用する。
例:E4=SUM(INDIRECT("シート名!E1:E" & C4))
一見、match関数を使用すると余計重くなりそうなところではあるが、
現実的な粒度でX軸を設定することで処理を軽くすることができる。
出来上がったグラフはこんな感じ。
Dドライブが垂直に上昇している部分を調べたら、Cドライブをバックアップした日だった。
今回はその対策についての紹介。
対象のデータは前回と同じ。
・CドライブとDドライブを解析した結果が各シートに出力されている。
・データはD列の更新日時昇順にソートされており、E列のファイルサイズが集計対象。
DIRコマンドの詳細は過去の記事を参照。
ファイル一覧解析マクロ
まず集計用のシートを追加し、作成したいグラフに合わせて
B列にX軸となるデータ列を作成。
C列、D列は、match関数で対象の日時が何行目に該当するか検索。
検索対象のデータを昇順にソートしたうえで照合の種類を1に設定することで、
検索値を超えない最大値の行数が返ってくる。
例:C4=MATCH(B4,dir_c.txt!$D$1:$D$170037,1)
1行目から該当行までのファイルサイズを合計することで、
ドライブの使用量を算出する。
参照先を可変にする場合は、indirect関数を使用する。
例:E4=SUM(INDIRECT("シート名!E1:E" & C4))
一見、match関数を使用すると余計重くなりそうなところではあるが、
現実的な粒度でX軸を設定することで処理を軽くすることができる。
出来上がったグラフはこんな感じ。
Dドライブが垂直に上昇している部分を調べたら、Cドライブをバックアップした日だった。
消そうとするとフリーズする数式
2021年04月20日
今回のPRA関係の話。
あるデータを変換して出力する処理を永遠とやっているPCがあって、
PCの空き容量が心配になったのでDirコマンドで全ファイル検索。
詳細は過去の記事[ファイル一覧解析マクロ]を参照。
(今使っているものとちょっと違うので、再掲載だな)
フォルダ内の全ファイルのサイズと更新日時を取得したので、
更新日時順にならべて、ファイルサイズを1行目から対象行までをSumで計算。
(例 : E3なら = sum($D2:$D3)
実はこの数式が厄介で、1行目のセルの値を変更すると全行の値が更新される。
当然、自動再計算はオフに設定して操作するんだけど、
このSumを計算している列を消そうとするとエクセルがフリーズする。
1万行なら帰ってくるけど、5万行超えたあたりから帰ってくる素振りがない。
列の削除もだめ、範囲を選択してDeleteボタンもだめ、空白セルをコピーしてもだめ。
どの操作もエクセルが上から処理するのがいけないと思いつき、
選択範囲の下から数式を削除するマクロを組んでみたらビンゴ!
無事消すことができた。
以下、ソース。
あるデータを変換して出力する処理を永遠とやっているPCがあって、
PCの空き容量が心配になったのでDirコマンドで全ファイル検索。
詳細は過去の記事[ファイル一覧解析マクロ]を参照。
(今使っているものとちょっと違うので、再掲載だな)
フォルダ内の全ファイルのサイズと更新日時を取得したので、
更新日時順にならべて、ファイルサイズを1行目から対象行までをSumで計算。
(例 : E3なら = sum($D2:$D3)
実はこの数式が厄介で、1行目のセルの値を変更すると全行の値が更新される。
当然、自動再計算はオフに設定して操作するんだけど、
このSumを計算している列を消そうとするとエクセルがフリーズする。
1万行なら帰ってくるけど、5万行超えたあたりから帰ってくる素振りがない。
列の削除もだめ、範囲を選択してDeleteボタンもだめ、空白セルをコピーしてもだめ。
どの操作もエクセルが上から処理するのがいけないと思いつき、
選択範囲の下から数式を削除するマクロを組んでみたらビンゴ!
無事消すことができた。
以下、ソース。
Uipathの高速化について
2021年04月20日
今回もUiPathを使ったRPAの話。
前任者が異動になって引き継いだものの、
素人が納期に追われてその場しのぎで作ったロボットはまさにカオス。。。
処理内容は、専用ソフトでのみ表示できるデータを別形式で出力するというもの。
普通に設計すれば、専用ソフトのみを画面上に表示して、
ファイル名の取得やログファイルへの出力なんてバックグラウンドでやるものだけど、
ファイル名の取得にメモ帳を起動して、クリップボードに移してメモ帳を閉じる。
ログ出力は、無題のメモ帳を永遠と編集して、最後に保存というロジック。
期限までに変換が終わらないリスクがあるので、高速化を検討してみた。
前任者が異動になって引き継いだものの、
素人が納期に追われてその場しのぎで作ったロボットはまさにカオス。。。
処理内容は、専用ソフトでのみ表示できるデータを別形式で出力するというもの。
普通に設計すれば、専用ソフトのみを画面上に表示して、
ファイル名の取得やログファイルへの出力なんてバックグラウンドでやるものだけど、
ファイル名の取得にメモ帳を起動して、クリップボードに移してメモ帳を閉じる。
ログ出力は、無題のメモ帳を永遠と編集して、最後に保存というロジック。
期限までに変換が終わらないリスクがあるので、高速化を検討してみた。
UiPathのメモリリーク対策 解決編
2021年04月16日
今回もRPAのメモリリーク対策の話。
再現OutOfMemoryが発生している状態の端末を触ることができた。
タスクマネージャーを開くと「UiPath.Executor.exe」が
1.4Gもメモリ食ってた。
前々回の記事で書いた「rundll32.exe」でメモリ解放する方法を試したけど、
「UiPath.Executor.exe」のメモリ使用量は全く変わらず。
(「rundll32.exe advapi32.dll,ProcessIdleTasks」をCMDで実行。)
ロボットがメモリを掴んだまま膨れ上がって落ちるようで、
ガベージコレクションのような方法は効果がなさげ。
さらに調べていくと、モジュールを呼び出す際に
「UiPath.Executor.exe」を別プロセスとして起動させることができるらしい。
再現OutOfMemoryが発生している状態の端末を触ることができた。
タスクマネージャーを開くと「UiPath.Executor.exe」が
1.4Gもメモリ食ってた。
前々回の記事で書いた「rundll32.exe」でメモリ解放する方法を試したけど、
「UiPath.Executor.exe」のメモリ使用量は全く変わらず。
(「rundll32.exe advapi32.dll,ProcessIdleTasks」をCMDで実行。)
ロボットがメモリを掴んだまま膨れ上がって落ちるようで、
ガベージコレクションのような方法は効果がなさげ。
さらに調べていくと、モジュールを呼び出す際に
「UiPath.Executor.exe」を別プロセスとして起動させることができるらしい。