マクロの問い合わせNo.25124
emc827 さん 08/06/28 11:34
 
winxp he sp3, hidemaru 7.07

銘柄code(a1.txt)からa2.txtを作成するマクロを教えてください。
銘柄code 4桁固定
a1.txt a2.txtの列は、tabで区切られています。

計算式:
GRSE=(終値ー始値)*0.618+始値
GRPB=(高値ー安値)*0.618+安値

a1.txt: 約1500個
コード 銘柄 市場 業種 現在値 始値 高値 安値 終値 前日比 騰落率 出来高 回転率
 取引時間
1332 日水 東証1 水産 514 500 520 497 514 +33 +6.86% 10,653,600 3.84% 06/27
15:00
3110 日東紡 東証1 繊維 242 228 251 226 242 +9 +3.86% 6,588,000 2.66% 06/27
14:59
9113 乾汽船 東証1 海運 1,654 1,563 1,664 1,563 1,654 +31 +1.91% 1,521,400 5.
17% 06/27 15:00

a2.txt: 約1500個
コード 銘柄 GRSE GRPB
1332 日水 509  511
3110 日東紡 237  241
9113 乾汽船 1,619  1,625

よろしくお願いします。

[ ]
RE:25124 マクロの問い合わせNo.25131
秀丸担当 さん 08/06/30 10:25
 

大変申し訳ありませんが、たびたびマクロの作成依頼がきて、そのたびに作るわ
けにもいかないので、できればマクロの作り方を習得していただいて、そのうえ
で分からない点があれば、わからない点について質問していただくという形にし
ていただけると助かります。

たとえば、あれこれ作ってみたけど、正規表現でタブ区切りの指定した位置の取
得方法がわからない、というご質問であるとか、文字列を計算する方法がわから
ない、とか、そういったご質問にしていただけると助かります。

以下の会議室もあるので、参考にしてみてください。

 秀丸エディタ マクロ作者会議室
 http://www.maruo.co.jp/hidesoft/4/indexg.html


ただやはり今回のは難しい点もあるかと思うので作ってみました。

  gofiletop;
  setclipboard "";
  while(1){
    searchdown2 "^([^\\t]+\\t){0}([^[\\t]+)(?\\2)", regular;
    if(result==false)break;
    $code = gettext(foundtopx,foundtopy,foundendx,foundendy);
   
    golinetop2;
    searchdown2 "^([^\\t]+\\t){1}([^[\\t]+)(?\\2)", regular;
    if(result==false)break;
    $name = gettext(foundtopx,foundtopy,foundendx,foundendy);
   
    golinetop2;
    searchdown2 "^([^\\t]+\\t){5}([^[\\t]+)(?\\2)", regular;
    if(result==false)break;
    $start = gettext(foundtopx,foundtopy,foundendx,foundendy);
    call delcomma, $start;
    $start = $$return;
   
    golinetop2;
    searchdown2 "^([^\\t]+\\t){6}([^[\\t]+)(?\\2)", regular;
    if(result==false)break;
    $high = gettext(foundtopx,foundtopy,foundendx,foundendy);
    call delcomma, $high;
    $high = $$return;
   
    golinetop2;
    searchdown2 "^([^\\t]+\\t){7}([^[\\t]+)(?\\2)", regular;
    if(result==false)break;
    $low = gettext(foundtopx,foundtopy,foundendx,foundendy);
    call delcomma, $low;
    $low = $$return;
   
    golinetop2;
    searchdown2 "^([^\\t]+\\t){8}([^[\\t]+)(?\\2)", regular;
    if(result==false)break;
    $end = gettext(foundtopx,foundtopy,foundendx,foundendy);
    call delcomma, $end;
    $end = $$return;
   
    if(val($code)==0)continue;
    $GRSE = str(((val($end) - val($start)) * 618 + val($start) * 1000 +
    500) / 1000);
    $GRPB = str(((val($high) - val($low)) * 618 + val($low) * 1000 +
    500) / 1000);
    addclipboard $code + "\t" + $name + "\t" + $GRSE + "\t" + $GRPB + "
    \n";
  }
  newfile;
  paste;
  endmacro;

delcomma:
  while(1){
    #i=strstr($$1,",");
    if(#i<0)break;
    $$1=leftstr($$1,#i) + rightstr($$1,strlen($$1)-#i-1);
  }
  return $$1;


[ ]
RE:25131 マクロの問い合わせNo.25132
秀丸担当 さん 08/06/30 10:42
 

自己レスですが、
([^[\\t]+)
となっていた部分は
([^\\t]+)
の誤りでした。

あとメール送信時に折り返しされてしまっていて、addclipboardの行は

addclipboard $code + "\t" + $name + "\t" + $GRSE + "\t" + $GRPB
             + "\n";

のほうがよかったです。

[ ]
RE:25132 何も表示されませんでしたNo.25134
emc827 さん 08/06/30 11:35
 
いろいろ親切に教えて頂き、大変感謝しております。
ご指摘の様に、今後はその様にいたします。
ただ、今回の件は、非常に難しく、分かりませんでした。
ご了承ください。

作成していただいたマクロを実行した結果、何も表示されませんでした。
私のミスかもしれません。一度、ご確認お願いします。

それとも、hm v7.07 versionの問題でしょうか?

コード 銘柄 市場 業種 現在値 始値 高値 安値 終値 前日比 騰落率 出来高 回転率
 取引時間
1332 日水 東証1 水産 514 500 520 497 514 +33 +6.86% 10,653,600 3.84% 06/27
15:00
3110 日東紡 東証1 繊維 242 228 251 226 242 +9 +3.86% 6,588,000 2.66% 06/27
14:59
9113 乾汽船 東証1 海運 1,654 1,563 1,664 1,563 1,654 +31 +1.91% 1,521,400 5.
17% 06/27 15:00

  gofiletop;
  setclipboard "";
  while(1){
    searchdown2 "^([^\\t]+\\t){0}([^\\t]+)(?\\2)", regular;
    if(result==false)break;
    $code = gettext(foundtopx,foundtopy,foundendx,foundendy);
   
    golinetop2;
    searchdown2 "^([^\\t]+\\t){1}([^\\t]+)(?\\2)", regular;
    if(result==false)break;
    $name = gettext(foundtopx,foundtopy,foundendx,foundendy);
   
    golinetop2;
    searchdown2 "^([^\\t]+\\t){5}([^\\t]+)(?\\2)", regular;
    if(result==false)break;
    $start = gettext(foundtopx,foundtopy,foundendx,foundendy);
    call delcomma, $start;
    $start = $$return;
   
    golinetop2;
    searchdown2 "^([^\\t]+\\t){6}([^\\t]+)(?\\2)", regular;
    if(result==false)break;
    $high = gettext(foundtopx,foundtopy,foundendx,foundendy);
    call delcomma, $high;
    $high = $$return;
   
    golinetop2;
    searchdown2 "^([^\\t]+\\t){7}([^\\t]+)(?\\2)", regular;
    if(result==false)break;
    $low = gettext(foundtopx,foundtopy,foundendx,foundendy);
    call delcomma, $low;
    $low = $$return;
   
    golinetop2;
    searchdown2 "^([^\\t]+\\t){8}([^\\t]+)(?\\2)", regular;
    if(result==false)break;
    $end = gettext(foundtopx,foundtopy,foundendx,foundendy);
    call delcomma, $end;
    $end = $$return;
   
    if(val($code)==0)continue;
    $GRSE = str(((val($end) - val($start)) * 618 + val($start) * 1000 + 500)
 / 1000);
    $GRPB = str(((val($high) - val($low)) * 618 + val($low) * 1000 + 500) /
1000);
    addclipboard $code + "\t" + $name + "\t" + $GRSE + "\t" + $GRPB
             + "\n";
  }
  newfile;
  paste;
  endmacro;

delcomma:
  while(1){
    #i=strstr($$1,",");
    if(#i<0)break;
    $$1=leftstr($$1,#i) + rightstr($$1,strlen($$1)-#i-1);
  }
  return $$1;


[ ]
RE:25134 何も表示されませんでしたNo.25135
秀丸担当 さん 08/06/30 11:46
 

ここの書き込みはタブは空白になっているので、ここに書かれたサンプルをコ
ピーしてもできないと思います。
区切りがタブであるサンプルであればできるのではないかと思います。
タブなのにできないとしたら、何が違うのかちょっと思い当たりません。

[ ]
RE:25135 ありがとう御座いましたNo.25136
emc827 さん 08/06/30 11:59
 
ご指摘の通り、tabがspaceになっていました。
元データtabから、希望通りにできました。
ありがとう御座いました。




[ ]