文章整形No.04302
pao さん 99/10/20 08:34
 

-----------------------------------------------------------
101,101,26-6203 WHITE,16K,3550,3000
101,101,26-6203 WHITE,1K,950,0
101,102,26-6255 RED,16K,6800,6500
101,103,26-6257 ORANGE,16K,5550,5400
102,653,ACRIL,15K,0,7900
102,1501,ULETAN WHITE SET,16K,16400,0
102,1501,ULETAN WHITE SET,3.2K,4650,4500
105,8999,FLAT,4K,4000,0
105,8999,AMINO 100 hard,1.6K,0,220
.
.
.
上記の様なCSV形式のデーターが凡そ 5万行ほどあるものを整形したいのですが 最
初の3桁の後の , の次のデーターが、0 表示されておらず
これに 0 を入れたいのが一つです。

その後の 

WHITE,16K,  の部分を

WHITE    16K,  と

WHITEの後にいくつかのスペースを入れ
全てのデーターの縦位置を揃えたいと言うのが2点目です。


こういった事が出来るマクロは存在するでしょうか?
低レベルな質問で申し訳ありませんが、どなたか分かる方
がいらっしゃいましたら是非教えてくださいますようお願いします。
----------------------------------------------------------
昨日UNICORN のサポート掲示板へ同メッセージを間違えて投稿し
ましたので、今一度こちらでお聞きすることにいたしました。



PAO

[ ]
RE:04302 文章整形No.04305
番頭++ さん 99/10/20 11:58
 
単なる置換で処理できると思います。意味がわかりませんがとりあえず ...

//  >これに 0 を入れたいのが一つです。
//*5    d1.mac
    if( code == 0x09 ){ endmacro;   }   //  個人的な理由 !
    replaceallfast "^[0-9][0-9][0-9],\\f.+$", "\\00\\1", regular, inselect;
endmacro;

こんな要望でしょうか ???

//*5    d2.mac
    if( code == 0x09 ){ endmacro;   }   //  個人的な理由 !
    replaceallfast "^[^,]+,[^,]+,\\f[^,]+\\f,.+$",
        "\\0\\1   \\2", regular, inselect;  //  3 space
endmacro;

それともこんな意味ですか ???

, ではなく [Tab] の処理ですが、そのうち発表する未完マクロです。1999/11/01 未
定 ...

//*5    d3.mac  前処理
    if( code == 0x09 ){ endmacro;   }   //  個人的な理由 !
    replaceallfast "^[^,]+,[^,]+,\\f[^,]+\\f,.+$",
        "\\0\\1\\t\\2", regular, inselect;  //  とりあえずタブにして !!!
    config "w250"; // これを超えると正常な処理にはなりません !!!
    selectall;
    setclipboard "30,s3,100";   //  [Ctrl] + V でコピー
    execmacro "KZ_CSVFIX1.mac";
//  call pp_KZ_CSVFIX1;
    replaceallfast "\x20+$", "", regular, inselect;
    gofiletop;
endmacro;

//*1 *** Macro for 「秀丸エディタ」 ***
pp_KZ_CSVFIX1:
//*1 【マクロ名】 KZ_CSVFIX1.mac - Ver. 03.01 - 1999/04/06
//*1 【作者】 K.Nakatake / 番頭++ / E-mail:xxxxxxxx@nifty.ne.jp
//*1 【機能】
//*1 ・CSV ( セパレータ , Tab ) データを固定長に編集する処理。
//*1 ・「カーソル行の以下全体」、
//*1 ・- または「範囲選択」された論理行が処理の対象です。
//*1 ・- 「範囲選択」は、論理行単位で指定してください。
//*1 ・編集の位置パラメータを入力してください。
//*1 ・- " n, : 左詰  -n, : 右詰  0, : 削除  sn, : 空白 n 文字"
//*1 ・- (英小文字で指定してください。)
//*1 ・- (シビアな入力チェックはしていません。)
//*1 ・- パラメータ数の制限があります。(現在は 016 です。)
//*1 ・編集の位置パラメータを指定しないで、[ OK ] を押すと、
//*1 ・- カーソル行から、編集の位置パラメータのパターンを取得して、
//*1 ・- Clipboard にコピーして、マクロを終了します。
//*1 ・この逆処理を行なうマクロは作りません、
//*1 ・-    replaceallfast "\x20[\x20]+", "\t", regular, inselect;  //  です !
//*1 ・自由に変更してご使用下さい !
//*1 【注意】
//*1 ・このマクロ、テストデータは Tab 4 で参照してください。
//*1 ・処理しない、行の後部は削除されます !
//*1 ・Clipboard の内容は変更されます !
//*1 ・searchdown; で、セパレータを探すと速くなるのですが、
//*1 ・- 現実的な使用方法では、
//*1 ・- このマクロを細かく修正するので right; にしてあります。
//*1 ・-    searchdown "[^\\t\\n]*[\\t\\n]", regular;
//*1 ・お世辞にも、速い処理マクロとは言えません !
//*1 ・多量なデータ処理には、不向きです !
//

//*D ・(例 1) : 編集の位置パラメータを指定する。
//*D    s4,8,s2,-6,s,12,s14,
//*D    aa  11111   bbbb
//*D    'aaaaaaaa'  "11,1"1 "bbbbbbbb"
//*D    'a      "bbbbbbbb

//*D ・(例 2) : 編集の位置パラメータのパターンを取得する。
//*D    次の行は 「3,s1,2,s2,-2,s1,2,s2,-3,s1,」 になります。
//*D    aaa bb  11 cc  999
//*D    a   b   1   c   99

    if( ( ! selecting ) && ( code == eof || code == '\x0D' ) ){ endmacro;   }
    disabledraw;    disableinvert;
    #sw_sel = selecting;    //  範囲選択
    if( #sw_sel ){
        #seltopx = seltopx; #seltopy = seltopy;
        #selendx = selendx; #selendy = selendy;
        #x_start = #seltopx;    #y_start = #seltopy;
    } else {
        //R gofiletop;
        golinetop2; //  趣味の問題 !!!
        #x_start = x;   #y_start = y;
    }
    if( #sw_sel && ( #seltopx + #selendx ) != 0 ){
        $wk1 = "範囲選択は論理行単位で指定してください !";
        message $wk1 + "\n\nマクロを中止します !";
        endmacro;   //  escape;
    }
    $wk2 = "8,8,8,8,";
    $wk1 = "編集の位置パラメータを入力してください !";
    $wk1 = $wk1 + "\n\n n, : 左詰  -n, : 右詰  0, : 削除  sn, : 空白 n 文字";
    $wk1 = input($wk1,$wk2);
    if( ! result ){ endmacro;   }
    if( iskeydown( 0x1B ) ){    endmacro;   }   //  [Esc]
    if( $wk1 == "" ){
        call pp_csv_parm_get1;
        endmacro;
        //T execmacro "KZ_CSVFIX1.mac";
        //T endmacroall;
    }
    $wk2 = $wk1;
    if( rightstr($wk2,1) != "," ){  $wk2 = $wk2 + ",";  }
    setclipboard $wk2;
    #j = 0; #k = 1;
    while( strlen($wk2) != 0 ){
        #i = strstr($wk2,",");
        $wk3 = leftstr($wk2,#i);
        $wk2 = midstr($wk2,#i+1,strlen($wk2));
        $t_parm1[#j] = $wk3;
        #t_parm1[#j] = val($wk3);
        if( leftstr($t_parm1[#j],1) == "s" ){   //  空白 n 文字
            #m = val(midstr($t_parm1[#j],1,999));
            if( #m <= 0 ){  #m = 1; }   //  空白 1 文字
            #t_parm1[#j] = #m;
            if( $t_parm1[#j] != "s" && $t_parm1[#j] != ( "s" + str(#m) ) ){
                message "パラメータの s フォーマットが違います ! \n\n" + $t_
parm1[#j];
                endmacro;
            }
        } else {
            if(  $t_parm1[#j] != "" && $t_parm1[#j] != str(#t_parm1[#j]) ){
                message "パラメータの n フォーマットが違います ! \n\n" + $t_
parm1[#j];
                endmacro;
            }
            #m = #t_parm1[#j];
            if( #m < 0 ){   #m = ( 0 - #m );    }
        }
        if( #k < #m ){   #k = #m;   }
        #j = #j + 1;
        if( #j > 016 ){ //  制限する、特別な理由はありません !!!
            message "パラメータの数が多すぎます ! \n\n" + str(#j-1);
            endmacro;
        }
    }
        $t_parm1[#j] = "[eof]"; //  終了
        #t_parm1[#j] = 0;
    $space = " ";
    while( #k ){
        $space = $space + " ";
        #k = #k - 1;
    }
//T menuarray $t_parm1, #j+1;
    if( width < 0250 ){
        config "w0250"; //  max. w1000 - 「秀丸エディタ」Ver. 3.00 以上
    }
    escape; moveto #x_start, #y_start;
    #i = 0; #j = 0;
    while( code != '\x0D' ){
        if( code == '\t' ){
            #i = #i + 1;
        } else if( code == ',' ){
            #j = #j + 1;
        } else {
        }
        right;
    }
    golinetop2;
    #sep = 00;
    if( ( #i + #j ) == 0 ){
        //R message "この行には、セパレータ ( , Tab ) がありません !";
        //R endmacro;
        $wk3 = "この行には、セパレータ ( , Tab ) がありません !";
        $wk3 = $wk3 + "\n\n セパレータを ( 1 文字) 指定してください !";
        $wk2 = input($wk3,"|");
        if( ! result ){ endmacro;   }
        if( iskeydown( 0x1B ) ){    endmacro;   }   //  [Esc]
        if( $wk2 == "" || strlen($wk2) != 1 ){  endmacro;   }
        #sep = ascii($wk2);
        //T message char(#sep);
    }
    if( #sep == 00 ){
        #sep = ',';
        if( #i ){   #sep = '\t';    }   //  separator   Tab.
    }
    while( code != eof ){
        if( #sw_sel && ( y >= #selendy ) ){ break;  }
        call    pp_csv_line1;
        right;
    }
    moveto #x_start, #y_start;
    enableinvert;   enabledraw;
endmacro;

pp_csv_line1:
    #k = 0;
    while( $t_parm1[#k] != "[eof]" ){
        #j = 0;
        #m = #t_parm1[#k];
        if( leftstr($t_parm1[#k],1) == "s" ){   //  空白 n 文字
            insert leftstr($space,#m);
        } else if( #m == 0 ){   //  フィールドを削除
            #q = 0;
            if( code == '\"' || code == '\'' ){
                #q = code;  delete;
                while( code != #q && code != '\t' && code != '\x0D' ){
                    delete;
                }
            }
            while( code != #sep && code != '\x0D' ){
                delete;
            }
            if( code == #sep ){ delete; }
        } else if( #m > 0 ){    //  左詰
            #x = x;
            call pp_csv_field1;
            #i = x;
            if( ( #i - #x ) < #m ){
                insert leftstr($space,(#m+#x-#i));
                //T message str(#m+#x-#i);
            } else if( ( #i - #x ) > #m ){
                message "このカラムのデータは長すぎます !";
                escape; endmacro;
            } else {
            }
            if( code == #sep ){ delete; }
        } else if( #m < 0 ){    //  右詰
            #m = ( 0 - #m );
            #x = x;
            call pp_csv_field1;
            #i = x;
            if( ( #i - #x ) < #m ){
                moveto #x, y;
                insert leftstr($space,(#m+#x-#i));
                moveto #x + #m, y;
            } else if( ( #i - #x ) > #m ){
                message "このカラムのデータは長すぎます !";
                escape; endmacro;
            } else {
            }
            if( code == #sep ){ delete; }
        } else {
            if( code == #sep ){ delete; }
        }
        #k = #k + 1;
    }
    if( code != '\x0D' ){   //  後続のデータは削除 !!!
        beginsel;   golineend2; delete;
    }
return;

pp_csv_field1:
    #q = 0;
    if( code == '\"' || code == '\'' ){
        #q = code;  delete;
        while( code != #q && code != '\t' && code != '\x0D' ){
            right;
        }
    }
    while( code != #sep && code != '\x0D' ){
        right;
    }
    if( #q && ( x > #x ) ){
        left;
        if( code == #q ){
            delete;
        } else {
            right;
        }
    }
return;

pp_csv_parm_get1:
    golinetop2;
    $$wk1 = "";
    while( code != '\x0D' ){
        ##i = 0;    ##c = code;
        while( code != '\x0D' && code == ##c ){
            ##i = ##i + 1;  right;
        }
        if( ##c == '\x20' ){
            $$wk1 = $$wk1 + "s" + str(##i) + ",";
        } else if( ##c >= '0' && ##c <= '9' ){
            $$wk1 = $$wk1 + "-" + str(##i) + ",";
        } else {
            $$wk1 = $$wk1 + str(##i) + ",";
        }
    }
    setclipboard $$wk1;
    golinetop2;
    message $$wk1;
//R endmacroall;
return;

endmacroall;
// end of macro.

今日は、風邪で死んでます、枕もとの 535E で 。。。
明日は回復するのやら ...

    replaceallfast ",", "\\t", regular, inselect; // , ==> [Tab]
endmacro;

またねます 。。。


[ ]
RE:04305 文章整形No.04306
番頭++ さん 99/10/20 12:36
 
勘違いだ、わかったわかった、
二つ目のフィールドを 4 けたの固定長にしたいんですよね、0 をまえずめで 。。。

102,0653,ACRIL              ,15K,0,7900
102,1501,ULETAN WHITE SET   ,16K,16400,0

//  >これに 0 を入れたいのが一つです。
//*5    d1a.mac
    if( code == 0x09 ){ endmacro;   }   //  個人的な理由 !
    replaceallfast "^[0-9][0-9][0-9],\\f[0-9][0-9][0-9],.+$", "\\00\\1", reg
ular, inselect;
endmacro;

//*1 【マクロ名】 KZ_CSVFIX1.mac - Ver. 03.01 - 1999/04/06
はメチャ遅いマクロですから、初めに 1000 行で試して、処理時間をみて、
5 万行、終わるのを待ちましょう 。。。


[ ]
RE:04306 文章整形No.04307
番頭++ さん 99/10/20 13:04
 
> //*1 【マクロ名】 KZ_CSVFIX1.mac - Ver. 03.01 - 1999/04/06
> はメチャ遅いマクロですから、初めに 1000 行で試して、処理時間をみて、
> 5 万行、終わるのを待ちましょう 。。。

[動作環境] ==> [ユーザーインターフェース] ==> [検索での表示] ==> 選択する
にして d4.mac だと速いです。。。

//*5    d4.mac
if( code == 0x09 ){ endmacro;   }   //  個人的な理由 !
    #f4 = 30;   //  好みにしてください !!!
    gofiletop;  insertreturn;
    while( strlen($sp) < #f4 ){ $sp = $sp + "\x20"; }
    disableinvert;  disabledraw;
    replaceallfast "^[0-9][0-9][0-9],\\f[0-9][0-9][0-9],.+", "\\00\\1", regu
lar, inselect;
    gofiletop;
    searchdown "^[0-9][0-9][0-9],\\f[0-9][0-9][0-9][0-9],[^,]+", regular;
    while( result ){
        right;
        if( x > 30 ){   endmacro;   }   //  おかしいでしょう !!!
        insert leftstr($sp,#f4-x);
        if( ! (y % 100) ){//1000
            enableinvert;   enabledraw;
            title time + " - Line - " + str(y);
            disableinvert;  disabledraw;
        }
        finddown;
    }
    gofiletop;  delete;
endmacro;

20 K Bytes にすると速いんですけどね ...
500 秒のしんぼうです ...


[ ]
RE:04307 文章整形No.04309
番頭++ さん 99/10/20 15:06
 
秀丸担当様
paste; //   が死にます。
//  paste;  //  これがネックみたいです !
これをコメントにして paste; は手作業で行ってください。
すると画面がおかしくなって死ぬと思います。

理論的にはこれが速いんですけど、
数千行を越えると paste; が死にます。

//*5    d5.mac
    if( code == 0x09 ){ endmacro;   }   //  個人的な理由 !
    #f4 = 30;   //  好みにしてください !!!
    gofiletop;  insertreturn;
    while( strlen($sp) < ( #f4 + 1) ){ $sp = $sp + "\x20"; }
    disableinvert;  disabledraw;
    replaceallfast "^[0-9][0-9][0-9],\\f[0-9][0-9][0-9],.+", "\\00\\1", regu
lar;
    replaceallfast "^[0-9][0-9][0-9],[0-9][0-9][0-9][0-9],[^,]+", "\\0" + $s
p, regular;
    gofiletop;  delete;
    title "1 - " + time;
    beginrect;  moveto #f4, y;  gofileend;  up; moveto #f4, y;
    cut;
    title "2 - " + time;
    selectall;
    replaceallfast "^[\x20]+", "", regular;
    gofiletop;
    title "3 - " + time;    //  この後だんまり !
    paste;  //  これがネックみたいです !
    title "4 - " + time;    //  これは見えない !
    gofiletop;
//  moveto #f4, y;  beginrect;
//  gofileend;  up; moveto #f4+1, y;    delete; gofiletop;
endmacro;

101,101,26-6203 WHITE,16K,3550,3000
101,101,26-6203 WHITE,1K,950,0
101,102,26-6255 RED,16K,6800,6500
101,103,26-6257 ORANGE,16K,5550,5400
102,653,ACRIL,15K,0,7900
102,1501,ULETAN WHITE SET,16K,16400,0
102,1501,ULETAN WHITE SET,3.2K,4650,4500
105,8999,FLAT,4K,4000,0
105,8999,AMINO 100 hard,1.6K,0,220


[ ]
RE:04309 文章整形No.04310
番頭++ さん 99/10/20 15:46
 
これでおしまい 。。。

//*5    d6.mac
    $t = time;
    if( code == 0x09 ){ endmacro;   }   //  個人的な理由 !
    #f4 = 30;   //  好みにしてください !!!
    gofiletop;  insertreturn;
    while( strlen($s) < ( #f4 + 1) ){ $s = $s + "\x20"; }
    while( strlen($p) < #f4 ){ $p = $p + "."; }
    disableinvert;  disabledraw;
    replaceallfast "^[0-9][0-9][0-9],\\f[0-9][0-9][0-9],.+", "\\00\\1", regu
lar;
    replaceallfast "^[0-9][0-9][0-9],[0-9][0-9][0-9][0-9],[^,]+", "\\0" + $s,
 regular;
    gofiletop;  delete;
    replaceallfast $p + "\\f[\x20]+", "\\0", regular;
//  gofiletop;
//  moveto #f4, y;  beginrect;
//  gofileend;  up; moveto #f4+1, y;    delete; gofiletop;
    gofiletop;
    message $t + " - " + time;
endmacro;


[ ]
RE:04310 文章整形No.04311
pao さん 99/10/20 17:52
 
番頭さん色々とご丁寧に教えていただき感謝もうしあげます。
これから一度試みてみます。

本当にありがとうございました。

PAO

[ ]