人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

秀丸初心者です。単純な統計的操作を自動化するマクロや方法が無いものかどうか探しています。自分がやりたいのは例えば以下のようなレベルのものです

テキストデーター内に1?100までの正の整数サンプル値が500個くらい散らばっている。

1.サンプル値の総和を求める→これはいいマクロを発見したので解決済み
2.例えば、サンプル値の中から20以下のものを抜き出し・・・
3.空白文字に置き換えたい(そうして最終的には足切り総和値を求めたい)

2の段階でどうしたものか迷っています。自分としてはこれ以上の本格的な統計作業は必要としていないので統計ソフトRのようなものはオーバークオリティだと思います。理数系の方なら「こんなのこれの機能使ってこうこうやれば簡単じゃん」とか答えてくれるのではないか、と甘い期待をして質問させていただきます。よろしくお願いします。

●質問者: minminjp2001
●カテゴリ:コンピュータ 科学・統計資料
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● TransFreeBSD
●100ポイント ベストアンサー

簡単なところだと20以下を正規表現で消してしまうのでしょうか。
元のデータ形式がわかりませんけれど、正規表現としては以下のような感じでしょうか。

(^|[ \t])0*(1?[0-9]|20)(?=[ \t]|$)

秀丸の正規表現は癖がありそうなので、これでいけるかわかりませんけれど。もしかすると下記の方がよいかもしれません(最初の行が漏れますけれど)。
(\s)0*(1?[0-9]|20)(?=\s)


さて、手動なら置換で上記正規表現を空白にしてやればよいですが、せっかくなので見つけてきたマクロに組み込むとよいと思います。下記の最後のサンプル参考にしました。
http://homepage2.nifty.com/jr-kun/hidemaru_qa/3_macro.html
元のマクロがわからないので具体的な場所はわかりませんが、最初の方のどこかに下記を入れれば良い気がします。
replaceall "(^|[ \\t])0*(1?[0-9]|20)(?=[ \\t]|$)"," ", regular; 

または
replaceall "(\\s)0*(1?[0-9]|20)(?=\\s)","\\1", regular; 


さらに自動化したい場合、オプション使ってマクロ自動実行するとよいでしょう。
http://homepage3.nifty.com/kons/hidemaru/helpsite/hidemaru/html/230_Option.html
Hidemaru.exe /xtotal.mac c:\path\to\data.txt

ファイルが決まっているならこんな感じでショートカット作っておけば良いと思います。

私は秀丸ユーザではないので、細かいところはよくわかりませんし間違いがあるかもしれませんが、だいたいこんな感じだと思います。
ちなみに私ならawkを使うかなぁ、という感じです。perlがあればそれ使いますけど、windowsだとこのために入れるかは利用頻度次第かな。
あと、wshを使う手もあります。最初はちょっと面倒なところあるけれど、ひな形できればそれの使い回しでいけるし、標準だし。
本格的にいろいろやる可能性あるならperlとかwshとか、それなりのスクリプト言語使えるとはかどりそうです。もちろんエクセルやOOoでVBAやpythonもありです。
結局、なに使ってどうやるかは、元のデータにもよるし今後の展開にもよるし、一つでやってしまってもよいし、個々に分担して連携もできるし、それぞれなので、一概には言えませんね。


minminjp2001さんのコメント
おおお、すごい!!(^|[ \t])0*(1?[0-9]|20)(?=[ \t]|$)で秀丸の置換ボックスに入力すると確かに20以下が空白化しました。目的上ドンピシャです。ちなみに(\s)0*(1?[0-9]|20)(?=\s)の方は反応しませんでした。 今後はこの表現を改変しながら利用しつつ、自分で正規表現がかけるように少しずつ勉強したいとおもいます。今回はどうもありがとうございました

minminjp2001さんのコメント
と思ったら、(^|[ \t])0*(1?[0-9]|20)(?=[ \t]|$)の20の部分を10に変更しても10?20まで空白化してしまいます。どうしたものでしょうか??とほ

TransFreeBSDさんのコメント
正規表現というのは数値でなく文字として処理します。 「(1?[0-9]|20)」のうち、「1?[0-9]」の部分が0?19に相当します。 「[0-9]」が0?9いずれか1文字をあらわし、「1?」が1があるときとないとき両方を表します。 「20」は20のみを表します。 前の「(^|[ \t])0*」が、行頭または空白またはタブ、そのあとに0個以上の0という意味です。 後ろの「(?=[ \t]|$)」が、行末または空白またはタブを表します。 以下いろいろパターン -0?9 --(^|[ \t])0*[0-9](?=[ \t]|$) -0?19 --0?9の前に1がついたときもOKにする --(^|[ \t])0*1?[0-9](?=[ \t]|$) -0?25 --0?19と20?25に分けて考える --(^|[ \t])0*(1?[0-9]|2[0-5])(?=[ \t]|$) -1?9 --(^|[ \t])0*[1-9](?=[ \t]|$) -1?19 --1?9と10?19に分けて考える --(^|[ \t])0*([1-9]|1[0-9])(?=[ \t]|$) --または1?9の前に1がついたときもOKと、10に分けて考える --(^|[ \t])0*(1?[1-9]|10)(?=[ \t]|$) -3?15 --3?9と10?15に分けて考える --(^|[ \t])0*([3-9]|1[0-5])(?=[ \t]|$) -6?44 --6?9と10?39と40?44に分けて考える --(^|[ \t])0*([6-9]|[1-3][0-9]|4[0-4])(?=[ \t]|$) -0?44 --0?39と40?44に分けて考える --(^|[ \t])0*([1-3]?[0-9]|4[0-4])(?=[ \t]|$)
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ