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


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

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

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

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2012/06/22 11:39:43
  • 終了:2012/06/25 08:26:59

ベストアンサー

id:TransFreeBSD No.1

TransFreeBSD回答回数667ベストアンサー獲得回数2682012/06/22 19:44:24

ポイント100pt

簡単なところだと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もありです。
結局、なに使ってどうやるかは、元のデータにもよるし今後の展開にもよるし、一つでやってしまってもよいし、個々に分担して連携もできるし、それぞれなので、一概には言えませんね。

他1件のコメントを見る
id:minminjp2001

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

2012/06/25 09:40:18
id: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]|$)
2012/06/27 20:40:59
  • id:taknt
    普通は こういう作業は オフィスのエクセルとか使ってやってしまうので
    無理に秀丸等で自動化してやるなんてことはないと思います。

    オフィスを持ってないのでしたら オープンオフィスなど無料のものを利用するというのもあるでしょう。

    ま、自動化は できるかは 不明ですが。
  • id:minminjp2001
    ありがとうございます エクセルとかだと500項目あるサンプル値を一つ一つセルに入力しないといけませんよね?それは避けたいのです。
  • id:TransFreeBSD
    元のデータ形式によりますが、エクセルでテキストファイル開けます。
    カンマ区切りとかスペース区切りとか区切り文字を指定したり、任意の桁での区切りもできます。
    また、データソースでテキストファイルを区切り方を選択して指定できます。
    これだと定型処理とか向いてます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません