長さが異なるスペースを.に置き換えたいNo.03259
haru さん 02/08/04 13:03
 
長さが異なるスペースを.に置き換えたい


 以下のようなファイルがあったとして

 変換前
(文の始め)
----------------------------------------------------------------------------
---\n
      品  名           高 値  平 均  単 位   県\n
----------------------------------------------------------------------------
---\n
0102 アアアアアアアアアアアアアア                  11,000     7,230     100本  愛知県\n
0105 イイイイイイイイイイイイイイイイイイイ              8,000     6,400     100本  愛知県\n
0113 ウウウウウウ                           7,000     4,880     100本  秋田県\n
(文の終わり)

 上記文を、品名と高値の間に全部スペースでなく、前後に1スペー
スずつ空けて「.」を入れたいのですが。
 タグ付き正規表現ではうまくいかないような気がします。
 何か良い方法を教えて下さい。
 よろしくお願いします。

 変換後
(文の始め)
----------------------------------------------------------------------------
---\n
      品  名           高 値  平 均  単 位   県\n
----------------------------------------------------------------------------
---\n
0102 アアアアアアアアアアアアアア ................ 11,000     7,230     100本  愛知県\n
0105 イイイイイイイイイイイイイイイイイイイ ............ 8,000     6,400     100本  愛知県\n
0113 ウウウウウウ ......................... 7,000     4,880     100本  秋田県\n
(文の終わり)

[ ]
RE:03259 長さが異なるスペースを.に置きNo.03260
encodingshiftjis さん 02/08/04 14:02
 
1行分では以下でできました、
後は範囲指定で行を回すとこです。

// 頭出し
searchdown "^[^ ]+ [^ ]+",regular;
right;
// 文字変換
searchdown "[ ]+",regular; escape;
while(x<selendx-1)overwrite ".";

[ ]
RE:03260 長さが異なるスペースを.に置きNo.03261
haru さん 02/08/05 13:07
 
>1行分では以下でできました、
>後は範囲指定で行を回すとこです。

>// 頭出し
>searchdown "^[^ ]+ [^ ]+",regular;
>right;
>// 文字変換
>searchdown "[ ]+",regular; escape;
>while(x<selendx-1)overwrite ".";
 このマクロを実行したんですが、何も変化せず、文字変換してく
れません。
 V3.17、Win95です。

[ ]
RE:03261 長さが異なるスペースを.に置きNo.03262
ENCODINGSHIFTJIS さん 02/08/05 17:19
 
>>// 頭出し
>>searchdown "^[^ ]+ [^ ]+",regular;
行頭から品名まで反転表示されているか
>>right;
カーソルは品名の後にあるか
>>// 文字変換
>>searchdown "[ ]+",regular;
空白部分は反転表示か?
 escape;
>>while(x<selendx-1)overwrite ".";
selendx は searchdown の結果が残るハズ

> このマクロを実行したんですが、何も変化せず、文字変換してく
>れません。
> V3.17、Win95です。

サーチのマッチした時の選択とかの設定はどうなっていますか?
マクロを頭から1行づつ増やして動作を確認します

[ ]
RE:03262 長さが異なるスペースを.に置きNo.03263
haru さん 02/08/06 08:59
 

>サーチのマッチした時の選択とかの設定はどうなっていますか?
>マクロを頭から1行づつ増やして動作を確認します
 という方法を使って、やっていたらうまく行きました。
 最初のカーソルを置く位置を間違えていました。

gofiletop;
while(1) {
// 頭出し
searchdown "^[^ ]+ [^ ]+",regular;
if ( !result ) break;
right;
// 文字変換
searchdown "[ ]+",regular; escape;
while(x < selendx-1)overwrite ".";
}

 としてみたら、全文OKです。ありがとうございます。

 ところで、品名にありがちな見やすくするために、途中にスペー
スが入ったときは変換できません。
 こういう場合も、対応するにはどうしたら良いですか?
 以下の例で、最下行の様な場合です。
 もしよろしければ、教えていただきたいのですが。
 よろしくお願いします。

----------------------------------------------------------------------------
---\n
      品  名           高 値  平 均  単 位   県\n
----------------------------------------------------------------------------
---\n
0102 アアアアアアアアアアアアアア ................ 11,000     7,230     100本  愛知県\n
0105 イイイイイイイイイイイイイイイイイイイ ............ 8,000     6,400     100本  愛知県\n
0113 ウウウウウウ ......................... 7,000     4,880     100本  秋田県\n
0000 エエエエエ オオオオオ aaaa                 7,000     4,880     100本  秋田県\n

[ ]
RE:03263 長さが異なるスペースを.に置きNo.03264
ENCODINGSHIFTJIS さん 02/08/06 10:47
 

// 末尾探し
searchdown "^[0-9]+ .{28}[^0-9]+",regular;
right;
// 頭探し
beginsel;
searchup "[^][ ]+",regular;
right 2;
escape;
// リーダー詰め
while(x < selendx-1)overwrite ".";
---------------------------------------
  .{28} は . を28個くりかえす指定です
標準の正規表現DLL を使っている時は
. を並べて下さい。

[ ]
RE:03264 長さが異なるスペースを.に置きNo.03265
haru さん 02/08/06 14:13
 
0113 あ い                            6,000     3,500     100本  宮城県

 ありがとうございます。うまくいきました。
 それと、上記のように実際の品名には全角文字も含んでいました。
 最初から、サンプルデータに入れておけば良かったのですが、こ
れを処理しようとするとうまくいきません。
 よろしくお願いします。

[ ]
RE:03265 長さが異なるスペースを.に置きNo.03266
encodingshiftjis さん 02/08/07 00:56
 
// 行選択
searchdown "^[0-9]+ ",regular;
// 末尾探し
moveto 22,y;// ルーラー目盛り指定
searchdown "[0-9]",regular;
// 頭探し
#endx=x;
searchup "[^ ]",regular;
right 2;
// リーダー詰め
while(x < #endx-1)overwrite ".";
------------------------------------
文字数カウントを止めて、目盛り指定に変更します。

こういう、テキストでのデータ処理の敏感さを避けるには
専用のソフトを使いましょう。いろいろ条件がさらに
重なった時は、こね上げるより解決が早いです。

昔の人もテキスト処理をかなり追及したが
結局、表計算とか、DBを使うようになりました。
単純なうちはテキスト、限界を越えたら専用ソフトです。

[ ]
RE:03266 長さが異なるスペースを.に置きNo.03267
haru さん 02/08/07 08:37
 
 ありがとうございます。

----------------------------------------------------------------------------
---\n
      品  名           高    平 均  単 位   県\n
----------------------------------------------------------------------------
---\n
0102 アアアアアアアアアアアアアア                  11,000     7,230     100本  愛知県\n
0105 イイイイイイイイイイイイイイイイイイイ              8,000     6,400     100本  愛知県\n
0113 ウウウウウウ                           7,000     4,880     100本  秋田県\n
0113 あ い                            6,000     3,500     100本  宮城県

 というものを変換したいのですが、うまくいきませんでした。

>文字数カウントを止めて、目盛り指定に変更します。
 文字数カウントにこだわり、というより他に思い付かないので、
試行錯誤を繰り返し、

gofiletop;
while(1) {
// 頭出し
searchdown "^[0-9]+ [^ ]+",regular;
if ( !result ) break;
searchdown "[ ]+[0-9]",regular;
escape;
right;
// 文字変換
while(x < selendx-2)overwrite ".";
}

 としたらうまく行きました。

>こういう、テキストでのデータ処理の敏感さを避けるには
>専用のソフトを使いましょう。いろいろ条件がさらに
>重なった時は、こね上げるより解決が早いです。
 わかりました。

>昔の人もテキスト処理をかなり追及したが
>結局、表計算とか、DBを使うようになりました。
>単純なうちはテキスト、限界を越えたら専用ソフトです。
 参考にさせていただきます。
 最後までお付き合いいただき、ありがとうございます。

[ ]
RE:03267 長さが異なるスペースを.に置きNo.03268
ENCODINGSHIFTJIS さん 02/08/07 10:39
 
品名に 数字が入らないことを確認しておきましょう。

9876 雪見大福  2個パック          100,000,000  
とか

[ ]
RE:03268 長さが異なるスペースを.に置きNo.03269
haru さん 02/08/07 13:06
 
>品名に 数字が入らないことを確認しておきましょう。
 確認したら、数字は使わないというお約束だそうです。(何故か)
 因みに全件検索してみたら、ありませんでした。(一安心)

>9876 雪見大福  2個パック          100,000,000  
 これを実行すると、うまくいきません。
 長々お付き合いいただきありがとうございます。
 またよろしくお願いします。

[ ]