過去の桐井戸端BBS (桐ver.9)
21017 カーソル位置の項目名を取得することはできるのでしょうか meishu 2003/06/21-14:35
みなさん、ご面倒をおかけしています。感謝。

 2つの表のある項目には同じデータが入っていなければならないのに、誤入力のために食い違っていて、
マッチングができなくなっています。
 「市ヶ谷」と「市ケ谷」とか「夕」(漢字)と「タ」(カタカナ)といった違いがおもです。
(中には、どうやってこんな間違いをしたんだ!−というようなのも・・・)

 チェック用の項目を設けて、項目置換に表引きを指定することで、違いがある行を特定することはできました。
(もちろん、両方とも同じ間違いを犯しているためにたまたま一致したものもあるには違いないのですが、
そういうのは後回しということで)
 しかし、画面上の表示を肉眼で眺めただけでは、「夕」と「タ」、「卜」(ボク)と「ト」(カタカナ)、「−」と「ー」などを
判別することは困難です。
 そこで、2つの表の該当する項目の文字列を取得して、先頭から1字ずつ比較する一括処理を、ヘルプと首っ引きで書きました。
一応動きます。

 その際に、比較すべき項目を特定する一般的な方法を思いつくことができませんで、
現在、実際の2つの表の該当する項目の名前を一括処理に書き込んでいます。

 2つの表の名前は、開いているウィンドウをチェックすることで、自動的に取得できます。
 処理中の行は、一括処理中で指定しなければ、この一括処理起動時にカーソルがあった行が自動的に対象になるようですから、
意識しなくてもいいようです。
 複数行を選択していて起動してしまった場合など、スクリプトでは顧慮していない起こり得る事態はいろいろありましょうが、
項目内容を読み取るだけで、表データ自体に対しては何も処理しない一括処理ですから、エラーが起こっても被害はとくにないでしょう。

 後、比較すべき項目の項目名ないし番号を自動的に取得することが可能なら、
特定の表の構造に左右されない一括処理になるのではないかと思った次第です。

 どうも長いばかりでうまく説明できません・・・。
 この発言へのコメントに一括処理の内容を書き込んでみます。

21018 2つの表の特定項目の文字列を照合する meishu 2003/06/21-14:38
記事番号21017へのコメント
* 開いている2つの表の [比較項目] 項目の文字列を照合する

変数宣言 整数{ &Handles[ 2 ] }
変数宣言 文字列{ &表名[ 2 ] }
変数宣言 整数{ &番号 }
変数宣言 文字列{ &Mes[ 2 ] }
変数宣言 文字列{ &項目内容[ 2 ] }
変数宣言 文字列{ &tmpstr }

ウィンドウリスト取得 &Handles

繰り返し &番号 = 1,2
if( &Handles[&番号]=#未定義 )
メッセージボックス "Error! - 処理中止", "比較する2つの表を開いてから実行してください。"
中止
繰り返し中止
end
ウィンドウ情報取得 &Handles[&番号], 表名=&表名[&番号]
&Mes[&番号] = #連結( #str(&番号), ": ", &表名[ &番号 ] )
繰り返し終了

編集表 &Handles[1]
&項目内容[1] = [比較項目]
編集表 &Handles[2]
&項目内容[2] = [比較項目]

繰り返し &番号 = 1, #L( &項目内容[1] )
if( &番号 > #L( &項目内容[2] ) )
繰り返し中止
end
if( #SSTR( &項目内容[1] , &番号 , 1 ) = #SSTR( &項目内容[2] , &番
号 , 1 ) )
&tmpstr = #cat( &tmpstr, "_" )
else
&tmpstr = #cat( &tmpstr, #SSTR( &項目内容[2] , &番号 , 1 ) )
end
繰り返し終了
&項目内容[2] = &tmpstr

メッセージボックス "比較項目比較", #連結(&Mes[1], "\n", &Mes
[2], "\n\n1: ", &項目内容[1], "\n2: ", &項目内容[2]), 制御文字展開=する

21019 Re:カーソル位置の項目名を取得できたら汎用化できる meishu 2003/06/21-14:48
記事番号21017へのコメント
すみません。字下げが飛んでしまって、えらく見にくくなりました。

 先に「一応」と書きましたが、どうもこのスクリプトには何か単純な大間違いがあるのではないかと・・・。
 といいますのが、これを使って作業を続けていますと、桐の動作が怪しくなってまいります。
ほかに原因がある可能性も否定できませんが・・・。

 ついでといってはなんですが、そのあたり、添削していただけると幸いに存じます。

 それにしても今日は、肝腎の作業を中断したまま、こちらの掲示板に書き込むのに四苦八苦しています。
 これが決して本末転倒でなく、急がば回れでありますように・・・。

21020 Re:カーソル位置の項目名を取得できたら汎用化できる うにん 2003/06/21-15:03
記事番号21017へのコメント
> 2つの表のある項目には同じデータが入っていなければならないのに、誤入
>力のために食い違っていて、マッチングができなくなっています。

同じデータであるべき行はどうやってわかるのでしょうか?
2つの表が同じ行数で同じ行には同じデータ?
あるいは、なにか照合できるキーがあるとか?
その項目に入る文字列の集合が一定のものに限られている?

> 「市ヶ谷」と「市ケ谷」とか「夕」(漢字)と「タ」(カタカナ)といった
>違いがおもです。(中には、どうやってこんな間違いをしたんだ!−というよ
>うなのも・・・)

その項目に「市ケ谷」という文字列はありえない、というケースなら、
単純に#文字置換()を使って全部「市ヶ谷」に変えれば済みますが、

> しかし、画面上の表示を肉眼で眺めただけでは、「夕」と「タ」、「卜」
>(ボク)と「ト」(カタカナ)、「−」と「ー」などを判別することは困難で
>す。

「−」と「ー」等は両方とも使われるのでしょうから、結局は目視で直すべき文字なのか判断するしかないと思います。
その場合は桐でやるよりも、一旦テキストファイルに落として、
テキストエディタの連続置換機能で1つづつ置換した方が簡単なような。。。

21021 Re:カーソル位置の項目名を取得できたら汎用化できる うにん 2003/06/21-16:00
記事番号21019へのコメント
> 先に「一応」と書きましたが、どうもこのスクリプトには何か単純な大間違い
>があるのではないかと・・・。
> といいますのが、これを使って作業を続けていますと、桐の動作が怪しくなっ
>てまいります。ほかに原因がある可能性も否定できませんが・・・。

ざっと見ると「編集表」コマンドの引数が問題になりそうですが。
表形式編集で2つだけ開いていれば問題ないでしょうけど、編集表のないフォームを開くと
ハンドル40番から下向きに番号がつくようですし。

繰り返し中止の前に中止コマンドがあるのって、別に問題ないですよねえ?

あとは#cat()関数は単独で使ってもほとんど意味がないので連結には
+演算子の方がすっきりするなあ、とか^^;

カーソル位置の項目値はONnojiさん紹介の過去ログより
#項目属性(#項目番号(#U),0)
でできますね。

ところで、「しかし、画面上の表示を肉眼で眺めただけでは、
「夕」と「タ」、「卜」(ボク)と「ト」(カタカナ)、「−」と「ー」などを判別することは困難です。」ということですが、
判別する必要があるんでしょうか?
結局は正しいデータに直したいということではない?

21024 Re:カーソル位置の項目名を取得できたら汎用化できる meishu 2003/06/21-16:49
記事番号21020へのコメント
うにんさんは

>同じデータであるべき行はどうやってわかるのでしょうか?

 レコードの順番です。
 ただし、脱落や重複、数箇所はなぜか順序が入れ代わっていたりしましたので、
前処理に少々手間取りました。(もちろん、まだ違っている箇所が残っている可能性もおおいにあります。)
 現在、私の手元のものには、整理の便宜上「連番」を付しています。

>その項目に「市ケ谷」という文字列はありえない、というケースなら、
>単純に#文字置換()を使って全部「市ヶ谷」に変えれば済みますが、

 文字置換をてきるだけ利用したいと願っています。
 この「照合」は、そのためのパターン探し用補助ツールといったところです。

>「−」と「ー」等は両方とも使われるのでしょうから、結局は目視で直すべき
>文字なのか判断するしかないと思います。

 はい。そのための補助ツールとしてこの一括処理を書きました。

>その場合は桐でやるよりも、一旦テキストファイルに落として、テキスト
>エディタの連続置換機能で1つづつ置換した方が簡単なような。。。

 桐での処理に入る前、csvに落としてあるデータを Perl で比較したり、エディタに読み込んで一部修正したりもしております。
 ただ、エディタに読み込んだ場合の総行数がなぜか、同じデータを桐やエクセルに読み込ませた場合の行数(レコード件数)と
食い違って表示されたり、データ中に2バイトの「”」でくくられたデータがある場合に「”」でくくられた外の文字列が
消えていたりする例があったり、といったことに気がつきまして、不用意にテキスト(csvを含めて)に書き出したり、
桐に読み込んだりを繰り返すことに危惧をもったため、しばらくは桐上で主に作業を進めようかと考えております。

 因みに、45000行足らずの件数です。

21025 Re:カーソル位置の項目名を取得できたら汎用化できる ONnoji 2003/06/21-16:52
記事番号21019へのコメント
>先に「一応」と書きましたが、どうもこのスクリプトには
>何か単純な大間違いがあるのではないかと・・・。
>といいますのが、これを使って作業を続けていますと、
>桐の動作が怪しくなってまいります。
>ほかに原因がある可能性も否定できませんが・・・。

meishuさん、こんにちは。

うにんさん、横レスを失礼します。m(__)m

動作が怪しくなるというのでは、
具体的にどうなるのか不明なので見当がつきませんが、
単にWin9x系でよく起こるリソース不足でしょうか???

なお、コマンドの使い方としては[中止]コマンドが気になりますが・・・
大丈夫でしょうか?

桐ver.8のヘルプより引用します。

中止
------------------------------------------------------
イベントでの使用 ×不可
■説明
・このコマンドは、一括処理を実行する前に、
 表またはフォームが開かれていたかどうかで動作が変わります。

・表もフォームも開いていない状態で一括処理を実行した場合は、
一括処理を終了する前に、表の更新結果を破棄して、
使用したファイルとウィンドウをすべて閉じます。
ただし、バックアップ指定のない表と、
共有更新で開いている表については、編集結果が保存されます。
パラメータに「桐」を指定した場合は、
メッセージボックスを出さずに桐も終了します。

・表またはフォームを開いた状態で一括処理を実行した場合は、
一括処理だけを終了します。
パラメータに「桐」を指定した場合は、
表の更新内容を保存するかどうかを確認する
メッセージボックスを出した後、桐の実行を終了します。


  * 開いている2つの表の [比較項目] 項目の文字列を照合する
  
  変数宣言 整数{ &Handles[ 2 ] }
  変数宣言 文字列{ &表名[ 2 ] }
  変数宣言 整数{ &番号 }
  変数宣言 文字列{ &Mes[ 2 ] }
  変数宣言 文字列{ &項目内容[ 2 ] }
  変数宣言 文字列{ &tmpstr }
  
  ウィンドウリスト取得 &Handles
  
 ┌繰り返し &番号 = 1,2
 │ ┌if( &Handles[&番号]=#未定義 )
 │ │  メッセージボックス "Error! - 処理中止"\
 │ │   , "比較する2つの表を開いてから実行してください。"
 │ │  中止
←┼─┼──繰り返し中止
 │ └end
 │  ウィンドウ情報取得 &Handles[&番号], 表名=&表名[&番号]
 │  &Mes[&番号] = #連結( #str(&番号), ": ", &表名[ &番号 ] )
 └繰り返し終了
  
  編集表 &Handles[1]
  &項目内容[1] = [比較項目]
  編集表 &Handles[2]
  &項目内容[2] = [比較項目]
  
 ┌繰り返し &番号 = 1, #L( &項目内容[1] )
 │ ┌if( &番号 > #L( &項目内容[2] ) )
←┼─┼──繰り返し中止
 │ └end
 │ ┌if( #SSTR( &項目内容[1] , &番号 , 1 )\
 │ │   = #SSTR( &項目内容[2] , &番号 , 1 ) )
 │ │  &tmpstr = #cat( &tmpstr, "_" )
 │ ├else
 │ │  &tmpstr = \
 │ │   #cat( &tmpstr, #SSTR( &項目内容[2] , &番号 , 1 ) )
 │ └end
 └繰り返し終了
  &項目内容[2] = &tmpstr
  
  メッセージボックス "比較項目比較", #連結(&Mes[1], "\n"\
   , &Mes[2], "\n\n1: ", &項目内容[1], "\n2: "\
   , &項目内容[2]), 制御文字展開=する
 
  

21030 Re:カーソル位置の項目名を取得できたら汎用化できる meishu 2003/06/21-17:27
記事番号21025へのコメント
ONnojiさん

 貴重なご助言をありがとうございます。
 また、見にくいリストを読みやすく整形してくださり、ありがとうございます。

>動作が怪しくなるというのでは、
>具体的にどうなるのか不明なので見当がつきませんが、
>単にWin9x系でよく起こるリソース不足でしょうか???

 何かの機能を呼び出すのがちょっと引っかかるように遅くなったかな、と思うと、例えば、この一括処理を呼び出すために、
Alt+F, R と押していき、次いでマウスに手を伸ばしてコマンド・ファイルを選択しようとすると、
なぜか真っ白けのダイアログが出て、操作できません。
 その状態でも、保存や終了はできます。
 再度桐を起ち上げると、何事もなかったように動くようです。(真っ白けのダイアログが出る状態になるまでには
2時間前後作業を続けています。再起動後、さらに数時間続けたことはこれまでありませんので、
確信はありません。が、Windows自体はなんともなく、桐内での現象のようではあります。)
 因みに、OSは WindowsXP です。

>なお、コマンドの使い方としては[中止]コマンドが気になりますが・・・
>大丈夫でしょうか?

 どう思われますか?
 (無責任なようですが、まったく判断がつかないのです。私・・・)

>・表もフォームも開いていない状態で一括処理を実行した場合は、
> 一括処理を終了する前に、表の更新結果を破棄して、
> 使用したファイルとウィンドウをすべて閉じます。

 こうして引用していただいて、改めて二度、三度目を通したのですが、私には根本的に理解できていないようです。
 開いていない表の更新結果を破棄するとは、一体どういうことなのか?

 桐自体を終了するのでなく、一括処理だけを終了するコマンドが別にあるのでしょうか?
 
 それと、「繰り返し」というのはいわゆるループなんでしょうから、その中で一括処理を止めてしまうというのは、
なんとなく「まずいのかも?」という感じもしています。
 この場合、2つだけが相手ですので、if にしてしまうか、ループの中ではフラグを付して、いったんループから出てから
終了させたほうがいいのだろうか・・・などとも迷っております。

21031 Re:カーソル位置の項目名を取得できたら汎用化できる 今村 誠 2003/06/21-17:44
記事番号21024へのコメント
meishuさんこんにちは
>>その項目に「市ケ谷」という文字列はありえない、というケースなら、
>>単純に#文字置換()を使って全部「市ヶ谷」に変えれば済みますが、
データの中身は住所録なのでしょうか、具体例が全くないので
アドバイスできないのですが、仮に住所録だとすれば、
郵便番号簿を参照して訂正したが一番楽だと思います。
文字列のデータと郵便番号のデータを比較して、
7桁の番号に郵便番号が変更できれば正常なデータ
下4桁が0000になるのは疑わしいデータとなりますので
チェックが容易になるかもしれません。
住所録でない場合は読み飛ばして下さい。
21032 Re:カーソル位置の項目名を取得できたら汎用化できる うにん 2003/06/21-18:15
記事番号21024へのコメント
> 現在、私の手元のものには、整理の便宜上「連番」を付しています。

なるほど。連番をキーにした結合表を作れば、違いのある行だけ表示しつつ、両方の表を同時に訂正できます。
フォームを作って文字コードも表示するとか、一方からもう一方へデータをコピーするボタンを作るとか...

21033 Re:カーソル位置の項目名を取得できたら汎用化できる ONnoji 2003/06/21-18:25
記事番号21030へのコメント
>何かの機能を呼び出すのがちょっと引っかかるように遅くなったかな、と思うと、
>例えば、この一括処理を呼び出すために、Alt+F, R と押していき、
>次いでマウスに手を伸ばしてコマンド・ファイルを選択しようとすると、
>なぜか真っ白けのダイアログが出て、操作できません。
>その状態でも、保存や終了はできます。
>再度桐を起ち上げると、何事もなかったように動くようです。
>(真っ白けのダイアログが出る状態になるまでには2時間前後作業を続けています。
>再起動後、さらに数時間続けたことはこれまでありませんので、
>確信はありません。が、Windows自体はなんともなく、桐内での現象のようではあります。)
>因みに、OSは WindowsXP です。

これは桐に限らないと思いますが…
ソフトを長時間使用している場合に、
ソフトの動作が不自然に緩慢になるようならば、
こりゃ変だぞと思っていいと思います。
WindowsNT系の場合には怪しくなったソフトを終了して、
再起動すれば大丈夫だろうと思います。
※Windows9x系の場合にはOSを再起動したほうが安全でしょう。

この辺の判断は勘しかありませんが、人間の勘は信用していいと思います。

ということで今回のことは、私も桐側の問題のような気がします。
OSがWindowsXPということなので桐ver.9でしょうか。

私は桐ver.8を Windows NT4.0で使用することが多いですが、
ある操作を繰り返しすると、桐の応答スピードが落ちる経験をいつもしています。
※Windows2000でも同じことが起こります。
こんな時には、さっさと桐ver.8を再起動しています。(^^ゞ

>>なお、コマンドの使い方としては[中止]コマンドが気になりますが・・・
>>大丈夫でしょうか?
> どう思われますか?
> (無責任なようですが、まったく判断がつかないのです。私・・・)
>>・表もフォームも開いていない状態で一括処理を実行した場合は、
>> 一括処理を終了する前に、表の更新結果を破棄して、
>> 使用したファイルとウィンドウをすべて閉じます。

流し読みでしたので再度読んでみたところ、
最初に表を開いてから一括処理を実行していますね。
ですから、一括処理だけが終了しているはずですね。

>それと、「繰り返し」というのはいわゆるループなんでしょうから、
>その中で一括処理を止めてしまうというのは、
>なんとなく「まずいのかも?」という感じもしています。
>この場合、2つだけが相手ですので、if にしてしまうか、
>ループの中ではフラグを付して、
>いったんループから出てから終了させたほうがいいのだろうか
>・・・などとも迷っております。

繰り返しの範囲内で一括処理を中止しても問題はないと思います。
いろいろな考え方がありますが、
私はこれは格好が悪いのでこういう書き方はしないと思います(^^ゞ
しかし、要は動けばいいのですから、あまり気にする必要はないと思います。

21034 修正版 meishu 2003/06/21-18:38
記事番号21018へのコメント
 頂いたアドバイスに従って修正してみました。

* 開いている2つの表の現在位置の項目の文字列を照合する

変数宣言 整数{ &Handles[ 2 ] }
変数宣言 文字列{ &表名[ 2 ] }
変数宣言 整数{ &番号 }
変数宣言 文字列{ &Mes[ 2 ] }
変数宣言 文字列{ &項目内容[ 2 ] }
変数宣言 文字列{ &tmpstr }

ウィンドウリスト取得 &Handles

繰り返し &番号 = 1,2
  if( &Handles[&番号]=#未定義 )
    メッセージボックス "Error! - 処理中止", "比較する2つの表を開いてから実行してください。"
    中止
  end
  if( #項目属性( #項目番号(#U), 2 ) <> "文字列" )
    メッセージボックス "Error! - 処理中止", "照合できるのは「文字列」項目だけです。"
    中止
  end
  ウィンドウ情報取得 &Handles[&番号], 表名=&表名[&番号]
  &Mes[&番号] = #str(&番号) + ": " + &表名[ &番号 ]
  編集表 &Handles[&番号]
  &項目内容[&番号] = #項目属性( #項目番号(#U), 0 )
繰り返し終了

繰り返し &番号 = 1, #L( &項目内容[1] )
  if( &番号 > #L( &項目内容[2] ) )
    繰り返し中止
  end
  if( #SSTR( &項目内容[1] , &番号 , 1 ) = #SSTR( &項目内容[2] , &番号 , 1 ) )
    &tmpstr = #cat( &tmpstr, "_" )
  else
    &tmpstr = &tmpstr + #SSTR( &項目内容[2] , &番号 , 1 )
  end
繰り返し終了
&項目内容[2] = &tmpstr

メッセージボックス "項目内容比較", #連結(&Mes[1], "\n", &Mes[2], "\n\n1: ",\
          &項目内容[1], "\n2: ", &項目内容[2]), 制御文字展開=する

21035 Re:カーソル位置の項目名を取得できたら汎用化できる meishu 2003/06/21-18:46
記事番号21033へのコメント
ONnojiさん
>WindowsNT系の場合には怪しくなったソフトを終了して、
>再起動すれば大丈夫だろうと思います。

 気が楽になりました。
 時々データを保存して、不安を感じたら、アプリケーション自体を再起動。こころがけます。

>OSがWindowsXPということなので桐ver.9でしょうか。

 すみません。そういえば、桐のバージョンまだ書いてなかったような・・・。
 Ver.9 です。

 実を言うと、どなたのコメントにお返事をしたかしなかったかさえ、よくわからなくなってきてるんです・・・。

>流し読みでしたので再度読んでみたところ、
>最初に表を開いてから一括処理を実行していますね。
>ですから、一括処理だけが終了しているはずですね。

 2つ以上の表を開いていないと「中止」、つもりなんですが、「表を開く」ということ自体の意味が、
私にはよく分かっていないのかもしれません・・・。(いよいよ自信がなくなってきた・・・)

>繰り返しの範囲内で一括処理を中止しても問題はないと思います。
>いろいろな考え方がありますが、
>私はこれは格好が悪いのでこういう書き方はしないと思います(^^ゞ
>しかし、要は動けばいいのですから、あまり気にする必要はないと思います。

 安心しました。ホッ!

21036 Re:カーソル位置の項目名を取得できたら汎用化できる meishu 2003/06/21-18:51
記事番号21031へのコメント
今村 誠さん

 ありがとうごさいます。そしてすみません。
 データの内容は住所ではありません。
 具体的にどういう性質のデータをどうしたいのか書いたほうが、より的確なアドバイスを頂けることはわかっているのですが、
このデータの内容をここに記すことはできません。
私自身がこのデータを扱わせてもらっているのも、非公式の暗黙の了解によるようなものなのです。
 あいまいなままで申し訳ありませんが、事情ご賢察ください。

21037 Re:カーソル位置の項目名を取得できたら汎用化できる meishu 2003/06/21-19:00
記事番号21032へのコメント
うにんさん

>なるほど。連番をキーにした結合表を作れば、違いのある行だけ表示しつつ、
>両方の表を同時に訂正できます。
>フォームを作って文字コードも表示するとか、一方からもう一方へデータを
>コピーするボタンを作るとか...

 便利そうですね。でも、私に手が出せるかどうか・・・。(いずれはそういうスキルも身につけたいが・・・)

 一方が正しくて一方が間違っているのならいいのですが、1件のデータのある部分はAが正しく、
他のある部分はBが正しい、というような事例もあります。
 また、どちらを正しいとすべきか、さらにはいずれも間違っているすべきか、判断に迷うような例も出ています。

 また、それぞれのデータは、それぞれの出所に返戻することになっています。
それぞれに変更点や、疑問点を注記する必要もあります。
 これは、私が作業している間にも、それぞれで何らかの理由でデータの修正がなされることがありますので、
私が作業を一段落した時点で、単純に入れ換えることができないだろうということもあります。

戻る