カンマ区切り行の操作No.05401
あつし さん 06/12/25 12:08
 
いつもお世話になっております。

カンマ区切り行について、縦に並べたり、横1行にすることが多く、
これをマクロにしたいのですが、カンマの次に改行文字を入れるところが
分かりません。似たようなマクロまたはアドバイスをお願います。

#----------------------------- ファイル1
001: SELECT
002:   A1top,A2mid,A3last,  -- comment
003:      B1,B2,B3,B4,
004:   C1,C2
005: FROM T1;
#-----------------------------

#----------------------------- ファイル2
001: SELECT
002:   A1top,
003:   A2mid,
004:   A3last,  -- comment
005:       B1,
006:       B2,
007:       B3,
008:       B4,
009:   C1,
010:   C2
011: FROM T1;
#-----------------------------

ファイル1で002-004の行を範囲指定してファイル2のようにしたいです。

逆の処理は、どの部分がどの行だったか判断が難しいので、例えば
ファイル2の004-008の行を範囲指定して1行にしたいと考えています。

で、まずはファイル1からファイル2への分解に挑戦しているのですが。

各行をループで処理することは分かりますが、その行の
「カンマの次に改行文字を入れる」やりかたが分かりません。
(理想的には、最後のカンマの次はそのままにしたい)
マクロの中で正規表現の置換は使えるのでしょうか?
カンマの他に、セミコロンも対象にしたいので、(環境変数のPATH用)
s/(?<=[,;])/\n/g
(「?<=」は前方一致のつもり、Perlでは可能)
のような置換処理で一気にできるものか、はたまた一文字づつチェック
していく処理を書かないといけないのか、見当が付きません。

宜しくお願いいたします。

[ ]
RE:05401 カンマ区切り行の操作No.05402
K'zawa さん 06/12/25 16:54
 
あつしさん、こんにちは。
K'zawaです。

>各行をループで処理することは分かりますが、その行の
>「カンマの次に改行文字を入れる」やりかたが分かりません。
>(理想的には、最後のカンマの次はそのままにしたい)
>マクロの中で正規表現の置換は使えるのでしょうか?
>カンマの他に、セミコロンも対象にしたいので、(環境変数のPATH用)
>s/(?<=[,;])/\n/g
>(「?<=」は前方一致のつもり、Perlでは可能)
>のような置換処理で一気にできるものか、はたまた一文字づつチェック
>していく処理を書かないといけないのか、見当が付きません。

正規表現の置換はマクロでできますよ。
置換ダイアログに記入する時と微妙に違う(エスケープシーケンスが増える)
ので、
0.範囲選択する(選択した範囲内のみオプションを有効にするため)
1.キー操作の記録開始
2.置換する
3.キー操作の記録終了
4.キー操作の保存 でマクロとして保存する

のようにして、そのマクロに多少手を加えればよいかと思います。

ちなみに改行を入れるのは、こんな感じでしょうか?

replaceallfast "(?<=[,;])" , "\\n" , regular, inselect;

[ ]
RE:05402 カンマ区切り行の操作No.05403
K'zawa さん 06/12/25 17:30
 
>(理想的には、最後のカンマの次はそのままにしたい)

何をもって最後と判断するのかよく分かりませんが、
後ろが半角スペースかタブと仮定して、

replaceallfast "(?<=[,;])(?![\x20\\t])" , "\\n" , regular, inselect;

ですかね。

[ ]
RE:05403 カンマ区切り行の操作No.05404
あつし さん 06/12/26 11:46
 
参考意見、有り難う御座います。

以下のSQL文のコメントを想定していたのですが、この点は
保留とします。

---------------------------------
SELECT
  A1top,A2mid,A3last,  -- comment
     B1,B2,B3,B4,      -- a
  C1,C2
FROM T1;
---------------------------------
2から3行目を選択して、マクロ実行↓
---------------------------------
SELECT
  A1top,
A2mid,
A3last,  -- comment
     B1,
B2,
B3,
B4,      -- a
  C1,
C2
FROM T1;
---------------------------------

まだマクロの書き方がわかっていないので、Perlで書いてみました。
何か一瞬黒いウィンドウが出るので、wperlを呼ぶことにしました。

クリップボード経由にしたのですが、もっとスマートな方法ありますか?

// カンマ・セミコロンの後に改行を追加するマクロ
if (selecting) {
  cut;   // 切り抜き
  runsync2 "wperl BreakByNL.pl";
  paste;  // 貼り付け
}
// ___END___

#!Perl
# BreakByNL.pl: Break By NewLine
use Win32::Clipboard;
my $clip = Win32::Clipboard();
my @rec = $clip->Get();
my ($NL) = $rec[0] =~ m|(\r?\n)$|;  # chcek NL
@rec = split /[\r\n]+/ => $rec[0]; # into lines
for (@rec) {
  s|(?<=[,;])(?=\s*[\w])|$NL|g;
}
$clip->Set(join($NL,@rec) . $NL);
__END__

[ ]
RE:05404 カンマ区切り行の操作No.05405
h-tom さん 06/12/26 13:08
 

h-tom です。

>以下のSQL文のコメントを想定していたのですが、この点は
>保留とします。
>
>---------------------------------
>SELECT
>  A1top,A2mid,A3last,  -- comment
>     B1,B2,B3,B4,      -- a
>  C1,C2
>FROM T1;
>---------------------------------
>2から3行目を選択して、マクロ実行↓
>---------------------------------
>SELECT
>  A1top,
>A2mid,
>A3last,  -- comment
>     B1,
>B2,
>B3,
>B4,      -- a
>  C1,
>C2
>FROM T1;
>---------------------------------
インデントの設定を見直しましょう。
自動インデントに設定していれば、インデントが効くはずです。

>まだマクロの書き方がわかっていないので、Perlで書いてみました。
>何か一瞬黒いウィンドウが出るので、wperlを呼ぶことにしました。
>
>クリップボード経由にしたのですが、もっとスマートな方法ありますか?
範囲選択すれば、標準入力として渡せますよ。
Perlスクリプト側の修正が必要ですが。
詳細は秀丸のヘルプで「プログラム実行の詳細」を見てください。

[ ]
RE:05405 カンマ区切り行の操作No.05406
あつし さん 06/12/26 15:10
 
有り難う御座います。自動インデントは設定してあるのですが・・・

consを使って書換え、前スぺースをいれてみました。

// BreakByNL.mac
// カンマ・セミコロンの後に改行追加
if (selecting) {
  run "wperl BreakByNL.pl <con >con";
}
// ___END___

#!Perl
# BreakByNL.pl: Break By NewLine
my @rec = <>;
my ($NL) = $rec[0] =~ m|(\r?\n)$|;  # chcek NL
my $leading_space;
for (@rec) {
  $leading_space = "";
  if (m|^(\s+)|) { $leading_space = $1 }
  s|(?<=[,;])(?=\s*[\w])|${NL}${leading_space}|g;
}
print @rec;
__END__

---------------------------------
SELECT
  A1top,A2mid,A3last,  -- comment
     B1,B2,B3,B4,      -- a
  C1,C2,C3
FROM T1;
---------------------------------

---------------------------------
SELECT
  A1top,
  A2mid,
  A3last,  -- comment
     B1,
     B2,
     B3,
     B4,      -- a
  C1,
  C2,
  C3
FROM T1;
---------------------------------

[ ]
RE:05401 カンマ区切り行の操作No.05407
ENCODINGSHIFTJIS さん 06/12/26 15:32
 
正規表現では 否定が難しいですから、

2回の置換
(.+?,)(?=.+?,)

\1\n

,(\s*[A-Z])

,\n\1
 
でそれらしく、なるでしょう。
\n の 所を マクロの
insertreturn   改行
にすると オートインデントになるでしょう。

[ ]
RE:05406 カンマ区切り行の操作No.05408
h-tom さん 06/12/26 16:02
 

h-tom です。

>有り難う御座います。自動インデントは設定してあるのですが・・・
済みません。手元のマクロは searchdowm + insertretuen 使ってたから
インデントが効いていたようです。
置換だとインデントは効きませんね。

[ ]