disabledraw について。No.04544
櫻井章一 さん 04/11/30 11:57
 


7000行ほどのテキストから任意の文字列に対して文字列+(説明文)
というような説明文付き文字に変換をさせたかったので

マクロを使ってあらかじめ別のテキストファイル(例:abc.txt)に作った

1文字列+(説明文)
2文字列+(説明文)
3文字列+(説明文)
    ・
    ・
    ・

上記のようなテーブルから検索し、その検索にヒットした
文字列を挿入という処理をしていたのですが
マクロ内で別のファイルをオープンし検索すると
disabledraw が有効でなくなり処理が遅くなりましたので、
テーブルから検索するという手法をやめて
下記のようなif文の羅列にしたところ処理は格段に早くなったのですが
if文が増えて変換対象文字列が3000ほどになるとif文も増えて
"バッファがオーバーしました"とエラーが出ます。

 beginsel;
 golineend ;
 cut;
 beginclipboardread;
 $abc = getclipboard;

  if( $abc == aaaaa){
   insert "aaaaa(説明文)";
 }else if( $abc == bbbbb){
  insert "bbbbb(説明文)";
     }


上記の処理を実現させたい時に
これを回避してかつdisabledraw が有効のときのような処理速度を保つ
いい方法はあるのでしょうか?
もしいい案があればご教授願いたいと思いますので
よろしくお願いいたします。

[ ]
RE:04544 disabledraw について。No.04545
ENCODINGSHIFTJIS さん 04/11/30 14:25
 
本格的な巨大辞書の使用 なら入力補完のマクロが参考になると思います

CompleteX v2.42 ◆リストボックスによる入力補完 2004/10/25
IKKI

など。

[ ]
RE:04545 disabledraw について。No.04546
櫻井章一 さん 04/11/30 15:14
 
ENCODINGSHIFTJISさん、早速の回答ありがとうございます。
ご紹介していただいたマクロを見たのですが、
今回はすべてを自動化させたいので
ご紹介していただいたマクロは今回の用途とはまた別物のようでした。
すみません。

実際にやりたいことは何万行からなるエラーログコードの解析でして
xxxxx
yyyyy
zzzzz
といった形で機器から吐き出されるエラーログコードに
たとえば
xxxxx電源異常
yyyyy電圧異常
zzzzz○○異常
といった感じにマクロを使用してやりたかったのです。
エラーコードは約7800ほどありますので
それぞれにどんなエラーなのかの意味を追加したかったのです。
だいたい解析するログは3万行〜7万行でいちいち手作業ではちょっと
対応しきれそうにありませんでした。    

[ ]
RE:04546 disabledrawについて。No.04547
IKKI さん 04/11/30 15:33
 
IKKI です。横から失礼します。

> xxxxx
> yyyyy
> zzzzz
 ↓
> xxxxx電源異常
> yyyyy電圧異常
> zzzzz○○異常

でしたら、辞書を INI ファイル形式にして getinistr を使うのがスマートだと思い
ますが、いかがでしょうか。

----------------
; errors.ini
[errorcode]
xxxxx=電源異常
yyyyy=電圧異常
zzzzz=○○異常
----------------
// sample.mac
down;
while (result) {
  golineend;
  insert getinistr(currentmacrodirectory + "\\errors.ini", "errorcode", gett
ext(0, y, x, y));
  down;
}
----------------

[ ]
RE:04546 disabledraw について。No.04548
ENCODINGSHIFTJIS さん 04/11/30 15:37
 
本格的なソフトの出番 と思いますが。

1.プログラムでテキスト処理する。
展開形を辞書(ハッシュ)にロードしてから
行をI/Oしながら展開。=(スクリプト入門にありそう)

2.DBに入れて、問い合わせる。
エラー番号をテーブルに入れ
展開形のテーブルを検索。=(SQL入門かな)

商用の高価なのでなくとも、ローカルで使えるのは多数ある
hsqldb(純Java)とかSQLite など、DBM系は?

[ ]
RE:04548 disabledrawについて。No.04549
IKKI さん 04/11/30 16:06
 
IKKI です。

> > エラーコードは約7800ほどあり
> > だいたい解析するログは3万行〜7万行
> 本格的なソフトの出番 と思いますが。
確かに、秀丸マクロでやるべき仕事ではないですね。 (^^;

> 1.プログラムでテキスト処理する。
> 展開形を辞書(ハッシュ)にロードしてから
> 行をI/Oしながら展開。=(スクリプト入門にありそう)
試しに簡単な Ruby スクリプトを書いてみました。
# ここは秀丸マクロの掲示板なので、このへんにしておきます。
# Ruby や Perl などのスクリプト言語についてもお調べになってみては。

----------------
# lookup.rb
# 辞書ファイルを読み込んでハッシュに格納
errors = Hash.new("")
IO.foreach("errors.dic") do |dic|
 num, desc = dic.chomp.split(/=/)
 errors[num] = desc
end
# 入力ファイルを1行ずつ加工して標準出力へ
ARGF.each do |log|
 log.chomp!
 puts log + errors[log]
end
----------------
; errors.dic
xxxxx=電源異常
yyyyy=電圧異常
zzzzz=○○異常
----------------
使い方
lookup.rb, errors.dic, logfile を同じフォルダに置いて
ruby lookup.rb logfile > logfile2

[ ]
RE:04549 disabledrawについて。No.04550
櫻井章一 さん 04/11/30 16:54
 
IKKI さん、ENCODINGSHIFTJISさん
ご回答ありがとうございました。

今回はIKKIさんが教えてくださったマクロにて
目的を達成することが出来ました。

> > > エラーコードは約7800ほどあり
> > > だいたい解析するログは3万行〜7万行
> > 本格的なソフトの出番 と思いますが。
>確かに、秀丸マクロでやるべき仕事ではないですね。 (^^;

私は、プログラマー、設計者ではなく
一年ほど前から業務が楽になるように秀丸マクロ言語を勉強してまして、
秀丸マクロ言語しか知りらないのでそのへんのことは無知ですいません。
つまり下記のようなこともなんのことだかさっぱりでして(^^;
> 展開形を辞書(ハッシュ)にロードしてから
> 行をI/Oしながら展開。=(スクリプト入門にありそう)
しかし、知らないことだらけでいろいろと勉強になります。
機器の保守員やってましてエラーログ詳細を
メーカーに報告等してるんで今回のマクロを作ろうかと思いました。

行数が多い時は、マクロにてファイル分割して対応しています。
とにかく、IKKIさんありがとうございました。
おかげさまで業務が楽になりそうです。

[ ]
RE:04550 disabledrawについて。No.04551
Iranoan さん 04/11/30 17:14
 
 櫻井章一さん今日は、Iranoan です。
> 今回はIKKIさんが教えてくださったマクロにて
> 目的を達成することが出来ました。
 全くの別解としては、一度置換を行う専用のウィンドウを
openfile "/h";
showwindow 0;
の要領で開いておき、置換は常にこの隠れたウィンドウで行い、後は
openfile, hidemaruhandle, setactivehidemaru と save を組み合わせれば、
> マクロ内で別のファイルをオープンし検索すると
> disabledraw が有効でなくなり処理が遅くなりました
については解消できます。

[ ]
RE:04548 disabledraw について。No.04552
ENCODINGSHIFTJIS さん 04/12/01 11:17
 
【追加】、秀丸マクロ以外の場合
3.OpenOffice や MS Office(Excel,Access)で 結合する
OpenOfficeでも (検索・行列)LOOKUP関数があるらしい
ので、セルの計算式で展開形を持って来れるでしょう。
http://homepage1.nifty.com/tabotabo/ooo/ooo01.htm

[ ]
RE:04551 disabledrawについて。No.04553
櫻井章一 さん 04/12/01 16:42
 
Iranoanさん、ご回答ありがとうございます。
そういった方法もできるのですね、別のマクロで
ファイルを多数開くものを使っていますので
是非そちらのほうへ教えていただいたテクニックを反映させたいと
思います。どうもありがとうございました。

[ ]
RE:04548 disabledraw について。No.04565
ENCODINGSHIFTJIS さん 05/01/11 15:44
 
ローカル環境でスタンドアローン で 使える
DB ソフトでやってみました。

▲ sqlite: SQLite データベースを管理するプログラム
http://www.net-newbie.com/sqlite/sqlite.html
▲ SQLite ControlCenter 日本語版 ( 簡易GUI )
http://www.takke.jp/prog_other.html

注)文書は最新の sqlite3 には合致しないかもしれない。
「UNIX 育ち」なので 文字コード、空白を含むファイル名、
日本語の表名・項目名(列名)は微妙です。全UNICODE で回すのが
安全ですが、UNICODEコンソールの無い Windowsでは困難です。
データのみShift_JIS で 列名などは 英数のみがいいです。
その他)BLOB の操作ももAPI はある、C++ ヘッダーもあるので
DLLを作って直結操作できるが、それほどの要求はないでしょう。

ーーーーーーーーーーーーーーーー 秀丸DB  (説明文のDB)
>  sqlite3.exe 秀丸DB "SELECT * FROM ERROR_SETUMEI;"

111|組合わせ美術
ggg|めんめん面
333|総合----

ーーーーーーーーーーーーー 元 エラー番号.TXT
333
ggg
111
111
ggg
333
333
111
333
ggg
---------------------------- SQL文に加工する 秀丸マクロ

// エラーNo のテキストを開いた ところで マクロ実行
replaceallfast "^","insert into tt values('",regular;
replaceallfast "$","');",regular;
gofiletop;
insert("CREATE TEMPORARY TABLE tt(ERRORNO varchar(9));\n");
insert("BEGIN TRANSACTION;\n");
gofileend;
insert("COMMIT;\n");
insert(".output stdout\n");
insert("SELECT tt.ERRORNO, CAUSE FROM tt NATURAL JOIN ERROR_SETUMEI;\n");
//
saveas "tt.sql";  // SQL文を書き出し
beginsel;
// クエリー実行 & 結果回収(ファイル末尾に 追加)
run "sqlite3.exe 秀丸DB \".read tt.sql\" > con";

------------------------------ できた tt.sql
CREATE TEMPORARY TABLE tt(ERRORNO varchar(9));
BEGIN TRANSACTION;
insert into tt values('333');
insert into tt values('ggg');
insert into tt values('111');
insert into tt values('111');
insert into tt values('ggg');
insert into tt values('333');
insert into tt values('333');
insert into tt values('111');
insert into tt values('333');
insert into tt values('ggg');
insert into tt values('');
COMMIT;
.output stdout
SELECT tt.ERRORNO, CAUSE FROM tt NATURAL JOIN ERROR_SETUMEI;

↑ tt.sql に saveas した内容
↓ sqlite3.exe 秀丸DB ".read tt.sql"   の結果

333|総合----
ggg|めんめん面
111|組合わせ美術
111|組合わせ美術
ggg|めんめん面
333|総合----
333|総合----
111|組合わせ美術
333|総合----
ggg|めんめん面


◆ 参考 ========= Microsoft 純正の DB が好ましいと思うのなら
▲ SQL Server 2000 Desktop Engine (MSDE 2000)
を入手してインストールする方法
http://support.microsoft.com/default.aspx?scid=kb;ja;324998

[ ]