ゲームエフェクトデザイナーのブログ | A Real-Time VFX Artist's Blog

About Making Materials on UE, Making Tools with C#, etc

秀丸の正規表現でパスとアセット名を分離

正規表現の備忘録です。

例えばエクセルでリストを作っている時に、下図のようにパスとアセット名が一緒になった状態からパスとアセット名を別セルに分離したい場面があったりします。

 f:id:moko_03_25:20160823013319p:plain

f:id:moko_03_25:20160823013320p:plain

しかしエクセルの標準機能でのやり方が分からないので、秀丸正規表現で分離することにしました(もっとお手軽な方法があればご教授ください)。

まずはリストを秀丸にコピペします。

f:id:moko_03_25:20160823013321p:plain

次に置換ダイアログを表示。
正規表現をONにして「検索」と「置換」に下図のように入力します。

f:id:moko_03_25:20160823013322p:plain

.+¥¥¥f¥f
¥0¥t¥1

検索欄の文字列の意味は‥
「1文字以上の文字列で末尾は¥」と「以降の文字列」にグループを分ける
文字列の後ろに¥fを追加するとグループ分けできます。
置換欄の文字列の意味は‥
「0番のグループの文字列」「水平タブ」「1番のグループの文字列」
‥です。
元のパスの¥による階層の区切りの数が行によってバラバラですが、検索欄の指定がたったこれだけでOKなのは秀丸正規表現には「最長の一致」という性質があるからのようです。

それから、文字列をグループに分けて置換に元の文字列を残しつつ形態を変える方法についてはこちらの記事でとても丁寧に解説されています。

‥という訳で置換を実行したら下図にようになりました。
全体を選択してコピーします。

f:id:moko_03_25:20160823013323p:plain

エクセルにペースト。はい、分離できました!

f:id:moko_03_25:20160823013324p:plain

もしエクセルにペーストした時にタブスペースを挟んで文字列が別セルに分かれない場合には、ホームタブの「区切り番号」で区切り文字を「タブ」にチェックを入れてからもう一度ペーストしてみてください。

以上になります。

あ、ちなみにセルA1とセルB1の文字列を結合するのは簡単です。
どこかのセルに「=A1&B1」のように入力すれば文字列が合体します。

エクセルで同じ文字列が並んだ行の合計値を出す

エクセルの備忘録。

下図のようにA列に同じ文字列が隣接する場合に、その文字列ごとのB列の合計値を算出‥それを全ての行に対して手軽に行う方法について。
この例だと同じパスのアセットのファイルサイズを合計したい場面になります。

f:id:moko_03_25:20160823023951p:plain

つまりこうなればOKという訳です。

f:id:moko_03_25:20160823023952p:plain

もっと簡単な表でやってみます。
空欄のC1セルを選んで‥

=IF($A1=$A2, "",SUMIF($A:$A,$A1,$B:$B))

と入力します。こちらは我がエクセル師匠に教えてもらいました。
意味は‥
①(IF部分)もしセルA1がセルA2と同じ値なら今選択しているセルC1は空白にする
②(SUMIF部分)IFに該当しないならA列全体の範囲で値がA1と同じ行のB列を合計する

しかしA列の値がA B A B C Aみたいにバラバラだったらうまくいかないのでソートして固めておかないとダメですね。

さてまだ何も表示されません。

f:id:moko_03_25:20160823023945p:plain

セルをだーーっと最下行までコピーします。
するとA列で同じ文字列が続いた場合は最後の行のC列に合計値が入ります。
それ以外のセルが空白のままというのがミソです。

f:id:moko_03_25:20160823023946p:plain

一番頭に一行挿入してC列をフィルタリング。

f:id:moko_03_25:20160823023947p:plain

空白セルを非表示にします。

f:id:moko_03_25:20160823023948p:plain

これで同じ行をまとめてしまって、ついでにB列の合計値を出せました。

f:id:moko_03_25:20160823023949p:plain

結果を別のシートにでもコピー&ペースト。
いらなくなったB列を削除して完成です。

f:id:moko_03_25:20160823023950p:plain

以上になります。

同じ文字列が隣接する場合にその行を削除してしまいつつも直接B列に合計値を上書けたらもっと手間が省けるのですがVBAでやるしか無いんですかね。。
良い方法をご存じでしたらご教授くださいっ。

*翌日の追記*
検索でこちらのページが見つかり、そのままサックリできました!

Sub Sample()
    Dim c As Range
    Dim dic As Object
    Set dic = CreateObject("Scripting.Dictionary")
    With Sheets("Sheet1")
        For Each c In .Range("A1", .Range("A" & .Rows.Count).End(xlUp))
            dic(c.Value) = dic(c.Value) + Val(c.Offset(, 1).Value)
        Next
        .Columns("C:D").ClearContents
        .Range("C1").Resize(dic.Count).Value = WorksheetFunction.Transpose(dic.keys)
        .Range("D1").Resize(dic.Count).Value = WorksheetFunction.Transpose(dic.items)
    End With
 End Sub
(上記サイト様より引用させて頂いています)

ついでにA列B列を削除して値の表示形式をユーザー定義でMiB表記に変えて、一定以上の値は赤字に塗るとかも追記してしまうと良さそうですね。