表抽出No.11420
AE86 さん 02/02/23 22:53
 
久々に問い合わせします。
座標表からNCデータ作成したい
CAD-CAM (製図 ソフト)から座標表の文字を抽出したサンプルを下例1 に示します。

1 現アルファベットは 全て N  に置換する
2 数値列の前に 順に X Y D を付加する
3 小数点のない数値列には  . を付加する
4 " , -  漢字 を削除
5 N番号だけの行 削除
以上の処理により下例2 のようにしたい。

例1
"NO.","X座標","Y座標","直径","備考"
"EP1","-116.66","-36.68","5.0","-"
"EP2","-145.80","-42.63","5.0","-"
"EP3","-166.51","-42.21","5.0","-"
"EP10","-171.43","20.10","6.1","-"
"EP11","-85.00","20.00","6.1","-"
"EP12","-228.00","-47.50","6.1","-"
"EP13","-232.00","-7.11","6.1","-"
"EP14"
"EP18","29.92","57.76","5.0","-"
"EP19","0.24","59.56","5.0","-"
"EP20","-19.65","65.32","5.0","-"
"B1","-355","-25","14","-"
"B2","-315","-25","14","-"
"B7~18"
"B19","160","280","14","-"
"B20","160","240","14","-"
"B21","160","200","14","-"

下例2
N1X-116.66Y-36.68D5.0
N2X-145.80Y-42.63D5.0
N3X-166.51Y-42.21D5.0
N10X-171.43Y20.10D6.1
N11X-85.00Y20.00D6.1
N12X-228.00Y-47.50D6.1
N13X-232.00Y-7.11D6.1
N18X29.92Y57.76D5.0
N19X0.24Y59.56D5.0
N20X-19.65Y65.32D5.0
N1X-355.Y-25.D14
N2X-315.Y-25.D14
N19X160.Y280.D14
N20X160.Y240.D14

このデータΔΔ1.txtに保存し 次に D によるグループ分けをする。
グループは O 〜M99 にまとめる。 ΔΔ2.txtに保存をする。

下例3
O
N1X-116.66Y-36.68
N2X-145.80Y-42.63
N3X-166.51Y-42.21
N18X29.92Y57.76
N19X0.24Y59.56
N20X-19.65Y65.32
M99
O
N10X-171.43Y20.10
N11X-85.00Y20.00
N12X-228.00Y-47.50
N13X-232.00Y-7.11
M99
O
N1X-355.Y-25.
N2X-315.Y-25.
N19X160.Y280.
N20X160.Y240.
M99

以上が全工程ですがどの程度可能ですか?
by AE86

[ ]
RE:11420 表抽出No.11421
小西 さん 02/02/24 01:46
 
小西といいます。 今晩は

例1→例2はタグつき正規表現で組めます。ただ、文字列の差し替えの都合上、3回か
けなければならないのでマクロにしてみました。

test1.mac
//-ここから-------
// NxxXxx.xxYxx.xx〜まで置換
replaceall "^\"[A-Z]+\\f[0-9]+\\f\",\"\\f[\\-0-9]+\\f(|.)\\f[0-9]*\\f\",\"\\
f[\\-0-9]+\\f(|.)\\f[0-9]*\",\"[\\-0-9]+(|.)[0-9]*\",\"-.*\"", "N\\1X\\3.\\5
Y\\7.\\9" ,regular;

// 残りをDxx.xxに置換
replaceall "\",\"\\f[\\-0-9]+\\f(|.)\\f[0-9]*\\f\",\"-.*\"$", "D\\1.\\3" ,re
gular;
// 余分な行を削除
replaceall "^\".*\\n", "" ,regular;
//-ここまで-------

例2→例3はマクロで何とかなるのかもしれませんがマクロバッファの問題もあるので
適当なスクリプトを使うほうが楽です。
今回はRubyで組んでみました。

test2.rb
#-ここから-------
text_line = Array.new;

ARGF.each do |line|
  tmp, num_t = line.split( /D/ );
  text_line << [ tmp, num_t.to_i ];
end

text_line.sort! { | x, y | x[1] <=> y[1] }

n = text_line[1][1];
print "○\n";
text_line.each do |i|
  if n != i[1]  then
    print "M99\n";
    print "○\n";
    n = i[1];
  end
  print i[0];
  print "\n";
end
print "M99\n";
#-ここまで-------

test1.macはファイルを開いた上でマクロの実行をします。
test2.rbはコマンドライン上でruby test2.rb △△△2.txt > △△△3,txtのように
使います.
Rubyは軽くてとても使いやすいです。ひとつ入れておいても損はないですよ。

[ ]
RE:11421 表抽出No.11422
山紫水明 さん 02/02/24 09:19
 
 AE86さん,小西さん,こんにちは。

 秀丸だけでやるとすれば,小西さんのマクロの後に直接次のマクロを続けてみ
たらいかがでしょう。

//----------------------------------------------------//
saveas "ΔΔ1.txt";
disabledraw;
while( 1 ) {
    gofileend;
    insert "O\n";
    gofiletop;
    searchdown "D[0-9.]+$", regular;
    if( !result ) break;
    $s = gettext( seltopx, seltopy, selendx, selendy );
    escape;
    golinetop2;
    while( 1 ) {
        searchdown $s;
        if( !result ) break;
        selectline;
        cut;
        gofileend;
        paste;
        golineend2;
        searchup "D";
        deleteafter;
        #i = #i + 1;
        prevpos;
    }
    gofileend;
    insert "M99\n";
}
gofileend;
up;
deleteline;
saveas "ΔΔ2.txt";
endmacro;
//----------------------------------------------------//

     では, (^^)/~
                                        山紫水明

[ ]
RE:11422 表抽出No.11423
AE86 さん 02/02/24 09:57
 
> 小西さん すばやい対応に感謝します。
>
> test1.mac
> file://-ここから-------
> // NxxXxx.xxYxx.xx〜まで置換
1行の文として使うんですよ..ネ?
希望通りの結果に満足です。

> // 余分な行を削除
> replaceall "^\".*\\n", "" ,regular;
> file://-ここまで-------
> test2.rb                //????
>// #-ここから-------
> text_line = Array.new;
>
M99\n";
>// #-ここまで-------

> test2.rbはコマンドライン上でruby test2.rb △△△2.txt > △△△3,txtのよう
に 使います.

//????  使い方を教えてください。(低レベル で ゴメンナサイ!!)



山紫水明さん 又々お世話になります。
全て希望通りの結果に満足です。

   by  AE86


[ ]
RE:11423 表抽出No.11424
小西 さん 02/02/24 12:48
 
>> test2.rbはコマンドライン上でruby test2.rb △△△2.txt > △△△3,txtのよう
>に 使います.
>
>//????  使い方を教えてください。(低レベル で ゴメンナサイ!!)
rubyの使い方ということでしょうか?
まずRubyをインストールします。インストールファイルは
  URL: http://www.ruby-lang.org/ja/install.html
から、たどるかC-Magagineの付録を使うのが楽でいいです。
Rubyのwindowsバイナリは数種類あるのですがCygwinを私は使ってます。
将来的にはMsWinに統一されそうな雰囲気ではあります。
インストールの詳しい内容は、上記のURLにありますのでそれを参考に指定してくだ
さい。

Win9x系とWinNT系ではパスの通し方が異なりますがパスを通して、
あとはコマンドラインで
  ruby              test2.rb    △△△2.txt > △△△3,txt
  ^Ruby実行ファイル ^スクリプト ^元ネタ     ^結果をリダイレクト
と打ち込めばいいです。

秀丸フォーラムで関係ないことを書いちゃって、他の方々すみません。
ここでお詫びします。


[ ]
RE:11421 表抽出No.11438
AE86 さん 02/02/25 23:09
 
> 小西さん  誠に恐縮ですが もう少し教えて下さい。
会社のPCでは Dxx.xx終了、もしくは 余分な行を削除 の開始の時点で、
検索ダイアログの中を検索してしまいます。この時点でハングアップ状態となりまし
た。
( Esc   Alt+F4  マウス は無効で Ctrl+Alt+Delete のみの対応でした。)
if (result != 1) break; をそれぞれに追加した結果 「breakする対象が見つかりま
せん」 となりました。
止まるタイミングは、同じですが、検索ダイアログの中を検索はしていない様です。
 
> test1.mac
> file://-ここから-------
> // NxxXxx.xxYxx.xx〜まで置換
> // 残りをDxx.xxに置換
> // 余分な行を削除
> file://-ここまで-------

1 適切なエラー時の脱出文   操作方法
2 秀丸の設定等 チェックする所 
3  段階的な解決方法
 
ちなみに エラーの発生したデータは自宅PCでは、適切に処理されました。
 共に秀丸のVerは3.08    PCは自宅、、Win98se        会社、、NT です。 
前回も同じ様な展開でしたので、ただ頭の下がる思いです。
では よろしくお願いします。
   by AE86 

[ ]
RE:11438 表抽出No.11439
さん 02/02/26 14:55
 
小西です。AE86さんお疲れ様です。

Win2k&WinXp(秀丸3.14)でチェックしましたが問題なかったです。

チェックポイントとしては
  1.そのファイルのサイズはどうか?
  2.秀丸を最新版(3.15)にしてもおきるかどうか?
  3.それぞれ、置換ダイアログで処理するようにしてもおきるか?

>会社のPCでは Dxx.xx終了、もしくは 余分な行を削除 の開始の時点で、
>検索ダイアログの中を検索してしまいます。この時点でハングアップ状態となりま
>した。
検索ダイアログを検索してるということは明らかにハングアップの状況ですね。(普
通はそんなことにならないはず。なんかウィンドウハンドルを取り違えるバグか?)

Win98がOkでNTがだめだけではよくわからないのですが、一番ややこしい最初の置換
がうまくいってない可能性がありますね。(メモリか? システムコールか? JRE32.D
LLがぶっ壊れているか? はたまたそれ以外の可能性も)

>if (result != 1) break; をそれぞれに追加した結果 「breakする対象が見つかり
>ません」 となりました。
そうだと思います。
>1 適切なエラー時の脱出文   操作方法
この場合は無理でしょう。

置換ダイアログでの正規表現は次のようになります。

// NxxXxx.xxYxx.xx〜まで置換
検索文字列^"[A-Z]+\f[0-9]+\f","\f[\-0-9]+\f(|.)\f[0-9]*\f","\f[\-0-9]+\f(|.)
\f[0-9]*","[\-0-9]+(|.)[0-9]*","-.*"
置換文字列
N\1X\3.\5Y\7.\9

// 残りをDxx.xxに置換
検索文字列
","\f[\-0-9]+\f(|.)\f[0-9]*\f","-.*"$
置換文字列
D\1.\3

// 余分な行を削除
検索文字列
^\.*\n
置換文字列
なし

順番にかけて問題ないことを確認してみてください.
これで問題ない場合、マクロの仕様の問題だと思います(多分)。

[ ]
RE:11422 表抽出No.11453
AE86 さん 02/02/26 22:37
 
山紫水明さん,小西さん,こんばんわ
表抽出を 小西さん + 山紫水明さん という形でトライしています。
11438の発言の続きですが、 
> // NxxXxx.xxYxx.xx〜まで置換
> // 残りをDxx.xxに置換
> // 余分な行を削除
 endmacro; をそれぞれに書き込んで正常動作が、確認できました。
saveas "ΔΔ1.txt"; も正常動作が、確認できました。
(昨日は // にてパスして使用していた)
ハングアップした時の状況把握ですので、100%とは言えませんが、この後 検索ダ
イアログの中を検索する様です。
そのとき カーソルは,ファイルの最後にあり、O は追加されていません。
ゆえに  > gofileend; 辺りに思われるのですが、、、、?


>  秀丸だけでやるとすれば,小西さんのマクロの後に直接次のマクロを続けてみ
たらいかがでしょう。
> saveas "ΔΔ1.txt";
> disabledraw;
> while( 1 ) {
>     gofileend;
>     insert "O\n";
>     gofiletop;

よろしく お願いします。
by AE86

[ ]