置換して文字列を取り出したいNo.06174
yamasan さん 09/07/11 10:02
 
こんにちは。よろしくお願いします。
置換して、文字列を取り出したいです。

--- 文字列1 ---
テキスト1

--- 文字列2 ---
テキスト2 

--- 文字列3 ---
テキスト3

--- 文字列4 ---
テキスト2 

--- 文字列5 ---
テキスト5

--- 文字列6 ---
テキスト6 

これを検索して、

テキスト1\tテキスト2\tテキスト3\tテキスト4\tテキスト5\tテキスト6

の様に、置換したいのです。

この様な箇所が、一つのファイルに、
数十箇所あります。
正規表現が拙いかも知れませんが、
以下の様なマクロで、一箇所づつ、取り出しています。

 setcompatiblemode 15;
 replacedown "^---.+-\\n\\f.+\\f\\n\\n---.+-\\n\\f.+\\f\\n\\n---.+-\\n\\f.+\
\f\\n\\n" , "\\1\\t\\3\\t\\5\\t" , regular, nocasesense, nohilight;
 if( ! result )  beep;
 replacedown "---.+-\\n\\f.+\\f\\n\\n---.+-\\n\\f.+\\f\\n\\n---.+-\\n\\f.+\\
f\\n" , "\\1\\t\\3\\t\\5" , regular, nocasesense, nohilight;
 if( ! result )  beep;

--------------

ですが、置換後の文字列のみを

テキスト1\tテキスト2\tテキスト3\tテキスト4\tテキスト5\tテキスト6
テキスト1\tテキスト2\tテキスト3\tテキスト4\tテキスト5\tテキスト6
・・・中略・・・
テキスト1\tテキスト2\tテキスト3\tテキスト4\tテキスト5\tテキスト6
テキスト1\tテキスト2\tテキスト3\tテキスト4\tテキスト5\tテキスト6
この様に、その数十箇所分取り出したいのですが、

分かりません。お教え願えませんでしょうか?
どうぞよろしくお願いします。

[ ]
RE:06174 置換して文字列を取り出したいNo.06175
yamasan さん 09/07/11 10:30
 
スイマセン、訂正です。

>--- 文字列4 ---
>テキスト2 
>

ですが、
テキスト2でなく、
テキスト4です。スイマセン。

--- 文字列4 ---
テキスト4 

の間違いです。よろしくお願いします。

[ ]
RE:06174 置換して文字列を取り出したいNo.06180
Iranoan さん 09/07/11 16:36
 
 yamasan さん今日は、Iranoan です。
> --- 文字列1 ---
> テキスト1
<snip>
> --- 文字列6 ---
> テキスト6
>
> これを検索して、
 6 つ 1 組みということでしょうか?
 それなら、末尾のマクロでどうでしょう。

 P.S \f で区切っても良いですが、() で挟むほうは取り出す部分だけに限定
できるので、私はこちらを愛用しています。
//---------- 下記のマクロは実際は一行 --------------------------------
replaceallfast "^---.+ ---\n(.+)\n\n---.+ ---\n(.+)\n\n---.+ ---\n(.+)
\n\n---.+ ---\n(.+)\n\n---.+ ---\n(.+)\n\n---.+ ---\n(.+)\n", "\\1\t
\\2\\t\\3\\t\\4\\t\\5\\t\\6",regular;

[ ]
RE:06180 置換して文字列を取り出したいNo.06185
yamasan さん 09/07/12 10:17
 
Iranoan さん、こんにちは。
ありがとうございます。お教え頂き、知識が増えました。


> P.S \f で区切っても良いですが、() で挟むほうは取り出す部分だけに限定
>できるので、私はこちらを愛用しています。

ありがとうございます。()で挟むというのは、
理解できてませんでした。知りませんでした。
これは、便利です。ありがとうございました。

テキスト1〜テキスト6が存在しない場合がありましたので、
(.+)を(.*)として、使います。助かりました。

もう一つ、お教え頂けませんでしょうか?

置換後の文字列
"\\1\t\\2\\t\\3\\t\\4\\t\\5\\t\\6"
だけを
その数だけ、その数の行数にして、
取り出すというのは、どのような条件を書くんでしょう?

全く分からないんです。
申し訳ありません。どうぞ、よろしくお願いします。

[ ]
RE:06185 置換して文字列を取り出したいNo.06186
IKKI さん 09/07/12 10:48
 
こんにちは。ユーザの IKKI です。

> 置換後の文字列
> "\\1\t\\2\\t\\3\\t\\4\\t\\5\\t\\6"
> だけを
> その数だけ、その数の行数にして、
> 取り出すというのは、どのような条件を書くんでしょう?

これは置換一発ではできません。
一度に6件ずつ処理するのでよければ、置換を2回使って

replacedown "^---.+ ---\n(.+)\n\n---.+ ---\n(.+)\n\n---.+ ---\n(.+)
\n\n---.+ ---\n(.+)\n\n---.+ ---\n(.+)\n\n---.+ ---\n(.+)\n", "\\1\t
\\2\\t\\3\\t\\4\\t\\5\\t\\6",regular;
replaceup "^(.*)$", "\\1\\n\\1\\n\\1\\n\\1\\n\\1\\n\\1", regular;

としてみてはいかがでしょう。
数十件 (不定の件数) を一度に処理するには、もっと複雑なマクロを書く必要が
ありそうです。

[ ]
RE:06186 置換して文字列を取り出したいNo.06188
yamasan さん 09/07/13 08:11
 
IKKI さん、おはようございます。
ありがとうございます。お教えの通り、何回か
やってみましたが、上手く行きません。スイマセン。

>これは置換一発ではできません。
>一度に6件ずつ処理するのでよければ、置換を2回使って
>
>replacedown "^---.+ ---\n(.+)\n\n---.+ ---\n(.+)\n\n---.+ ---\n(.+)
>\n\n---.+ ---\n(.+)\n\n---.+ ---\n(.+)\n\n---.+ ---\n(.+)\n", "\\1\t
>\\2\\t\\3\\t\\4\\t\\5\\t\\6",regular;
>replaceup "^(.*)$", "\\1\\n\\1\\n\\1\\n\\1\\n\\1\\n\\1", regular;


ありがとうございます。これを試したところ、
6件ずつにはなりませんでした。
同じデータが、6行続くだけになります。

つまり、6件ずつ処理。とはならず、
一件が、6行コピペされております。

変更箇所がお分かりでしたら、お教え下さいませ。
どうもすいません。お願いします。

[ ]
RE:06188 置換して文字列を取り出したいNo.06189
K'zawa さん 09/07/13 11:12
 
yamasanさん、こんにちは。
K'zawaです。

置換された文字列の間に別の不要な文字列があると言うことでしょうか?
Iranoanさんの置換文字列"\\1\t\\2\\t\\3\\t\\4\\t\\5\\t\\6"
の先頭に、仮の目印として例えば「\x0C」を入れておき、
"\\x0C\\1\t\\2\\t\\3\\t\\4\\t\\5\\t\\6"

次に「\x0C]で始まらない行と「\x0C」自体を空文字に置換してはいかがでしょ
う?


replaceallfast "^---.+ ---\n(.*)\n\n---.+ ---\n(.*)\n\n---.+ ---\n
(.*)\n\n---.+ ---\n(.*)\n\n---.+ ---\n(.*)\n\n---.+ ---\n(.*)\n",
"\\x0C\\1\t\\2\\t\\3\\t\\4\\t\\5\\t\\6", regular;
replaceallfast "^\\n|^[^\\x0C\\n].*\\n", "", regular;
replaceallfast "^\\x0C].*\\n", "", regular;

[ ]
RE:06189 置換して文字列を取り出したいNo.06191
yamasan さん 09/07/13 13:29
 
K'zawaさん、こんにちは。
ありがとうございます!!解決できました。
う〜ん。特殊文字を入れるとは、全く思いつきませんでした。


>replaceallfast "^---.+ ---\n(.*)\n\n---.+ ---\n(.*)\n\n---.+ ---\n
>(.*)\n\n---.+ ---\n(.*)\n\n---.+ ---\n(.*)\n\n---.+ ---\n(.*)\n",
>"\\x0C\\1\t\\2\\t\\3\\t\\4\\t\\5\\t\\6", regular;
>replaceallfast "^\\n|^[^\\x0C\\n].*\\n", "", regular;
>replaceallfast "^\\x0C].*\\n", "", regular;

最後の行を
replaceallfast "^\\x0C", "", regular;
とすることで、希望通りの動作をしています。
ありがとうございました。
--------------
もう少し教えて頂きたいのですが、
これは、Webでアンケートをとったものが、
メールで送られてきた結果の処理です。
投票した人数分のメールが来ますので、
それを一括でエクスポートすると、メールヘッダが、
かなり間に入るので、こういうマクロを。と、思ったんです。

今回質問したのは、6項目の回答があるアンケートでした。
これが、10項目になると、テキスト1〜テキスト10までを
タブ区切りにしていく作業が発生します。

その場合は、
replaceallfast "^---.+ ---\n(.*)\n\n---.+ ---\n(.*)\n\n---.+ ---\n(.*)\n\n--
-.+ ---\n(.*)\n\n---.+ ---\n(.*)\n\n---.+ ---\n(.*)\n\n---.+ ---\n(.*)\n\n--
-.+ ---\n(.*)\n\n---.+ ---\n(.*)\n\n---.+ ---\n(.*)\n",
"\\x0C\\1\t\\2\\t\\3\\t\\4\\t\\5\\t\\6\\t\\7\\t\\8\\t\\9\\t\\10", regular;

という、置換で良いのでしょうか?
それとも、\\10というのは使えませんか?
スイマセン、お教え下さい。よろしくお願いします。

[ ]
RE:06191 置換して文字列を取り出したいNo.06193
K'zawa さん 09/07/13 15:33
 
yamasanさん、こんにちは。
K'zawaです。

>最後の行を
>replaceallfast "^\\x0C", "", regular;
>とすることで、希望通りの動作をしています。

失礼。切り貼りしているときに一度滅茶苦茶になったので、間違えてしまった
ようです。
>それとも、\\10というのは使えませんか?

2桁は無理です。ヘルプのどこかに書いてあったような気がしないでもないんで
すが、ちょっと見当たりませんでした。(秀丸以外だったかも)

[ ]
RE:06193 置換して文字列を取り出したいNo.06195
yamasan さん 09/07/13 16:40
 
K'zawaさん、ありがとうございました。
分かりました。お教えありがとうございました。


>>それとも、\\10というのは使えませんか?
>
>2桁は無理です。ヘルプのどこかに書いてあったような気がしないでもないんで
>すが、ちょっと見当たりませんでした。(秀丸以外だったかも)


やはり、そうですよねぇ。
\fを使った正規表現で、駄目だったから、
予想してはいたのですが、()で挟んだら、
又、事情が違うかも知れないという淡い期待があったのでした。
申し訳ございませんでした。

お手数をおかけしました。ありがとうございました。

[ ]