1

$R を使用せずに文字列内の何かを置き換える最良の方法は何だと思いますか? グローバルを作成し、PETER を PAUL に置き換えようとしていますが、$R は使用しません。これは私がうまくいくと思ったものの繰り返しですが、最初の PETER を置き換えるだけです。同じ行に複数のピーターがいる場合、あなたは何を提案しますか?

Start  
SET ary="^XA"
SET queryary=$QUERY(@ary@(""))
WRITE !,@queryary
FOR   {
SET queryary=$QUERY(@queryary) 
    QUIT:queryary=""  
    w !,$p(@queryary,"PETER",1)_"PAUL"_$p(@queryary,"PETER",2,$l(@queryary,"PETER"))  

}
  QUIT

これは 2 回目の試行ですが、すべての変更を実行するには、複数回実行する必要があります。ループに欠けているものはありますか?

  Start  
  N ary
  S ary="^XA"
  S queryary=$Q(@ary@(""))
  S FROM="PETER"
  S TO="PAUL"
  W !,@queryary
  F   S queryary=$Q(@queryary) Q:queryary=""  w !,@queryary   d 
  . f  s $E(@queryary,$F(@queryary,FROM)-$L(FROM),$F(@queryary,FROM))=TO_" "     Q:ary'["PETER"  
  QUIT
4

5 に答える 5

2

$replace を使用しない場合は注意が必要です。私は $find と $extract 関数を使用しました...私のものは "MOZART" を "BACH" に置き換えます

mozartdocument
s ^XA(1)="ONCE UPON A TIME A COMPOSER NAMED MOZART WROTE"
s ^XA(2)="THE 'MOZART PIANO CONCERTO NUMBER ONE'. MOZART"
s ^XA(3)="MOZART 12 MOZART HANDEL MOZART MOZART 12"
s ^XA(4)="MAN MOZART MUMPS MANY MUNCHKINS MOZART"
s ^XA(5)="MOVE ALONG, NOTHING TO SEE HERE!"
s ^XA(6)="123 MOZART 456"
s ^XA(7)="HAPPILY EVER AFTER!"

for z = 1:1:7 {
    do {
        set x = $find(^XA(z),"MOZART")
        set $extract(^XA(z),x-6,x-1)="BACH"
    } while x > 0
    write !,^XA(z)
} write !
于 2016-05-12T20:17:10.450 に答える
1

キャッシュで作業していて、このためのユーティリティが必要な場合、 %GCHANGE は、説明したことを実行するためだけの非常に強力なプログラムです。私は常にユーティリティとして使用しており、プログラムから呼び出したことはありませんが、パラメーターを呼び出して渡すラベルがあると思います。

もう 1 つのことは、ループ内で複数の間接参照を使用しているため、プログラムの速度が低下することです。これらすべてを 1 つの文字列に結合し、文字列全体の間接化に E(X)ecute コマンドを使用することをお勧めします。以下に例を示します。

文字列を置き換える 2 つの異なる方法を含めました。1 つはEvgeny Shvarovが提案したのと同様に $P と $L を使用し、2 番目の方法は $F と $E を使用する方法です。

2 番目の方法は、100,000 ノードのグローバルで、ノードごとに 4 つの置換で平均 33% 高速に実行されました。

私のデータ生成を含めます。また、私が書いた関数のテストも行います。クロス プラットフォームで動作するように、これらを従来の MUMPS コードで記述しました。

更新: GTM のドキュメントを確認しました。%GCE は、GTM で使用できる同様のユーティリティです。更新: C4xuxoで説明されている LISA から ELISA への問題を適切に説明するために、REPLACE 関数を変更します。$P $L を使用するよりも高速に実行されます。

更新: バグを修正するために、REPLACE 関数の PS の値を調整しました。

;GLOBAL REPLACE METHOD 
GLBREPLACE(GLB,STR1,STR2) ;(GLOBAL NAME, STRING TO MATCH, STRING TO REPLACE WITH)
 S CMD="N I S I="""" F  S I=$O("_GLB_"(I)) Q:I=""""  S "_GLB_"(I)=$$REPLACE("_GLB_"(I),"""_STR1_""","""_STR2_""")"
 X CMD Q

;STRING REPLACE METHOD
REPLACE(STR,V1,V2) ;(INPUT STRING, STRING TO MATCH, STRING TO REPLACE WITH)
 N I,L,F1,F2,PS S PS=0,L=$L(STR,V1) F I=1:1:L-1 S F2=$F(STR,V1,PS),F1=F2-$L(V1),$E(STR,F1,F2-1)=V2,PS=F2+$L(V2) 
 Q STR



;======================================================================
;ADDITINAL FUNCTIONS

;THIS IS AN ALTERNATE METHOD, DOESN'T ADDRESS THE LISA TO ELISA PROBLEM
REPLACE2(STR,V1,V2) 
 N I F I=1:1:$L(STR,V1)-1 S STR=$P(STR,V1)_V2_$P(STR,V1,2,$L(STR,V1))
 Q STR

TESTGLBREPLACE ;THIS FUNCTION TESTS GLBREPLACE AND MEASURS PERFORMANCE
 S STIM=$ZTS S COUNT=100000
 D GENDATA(COUNT),GLBREPLACE("^XA","Peter","PAUL")
 S ETIM=$ZTS,TIMDIF=$P(ETIM,",",2)-$P(STIM,",",2),OCCURS=COUNT*4
 W !,"REPLACED "_OCCURS_" OCCURRENCES IN "_TIMDIF_" SECONDS"
 Q

GENDATA(L) ;THIS FUNCTION GENERATES DATA FOR A GIVE COUNT(L=INTEGER)
 F I=1:1:L S ^XA(I)="Peter Piper picked a peck of pickled peppers; A peck of pickled peppers Peter Piper picked; If Peter Piper picked a peck of pickled peppers, Where's the peck of pickled peppers Peter Piper picked"
 Q
于 2016-03-29T19:45:13.880 に答える
1

これはどう?

    ClassMethod PeterPaul()
{
    s ^XNAME(1)="PETER PIPER PICKED A PEPPER"
    s ^XNAME(2)="PETER ENJOYS PIZZA'. PETER" 
    s ^XNAME(3)="PETER WAS BORN IN 1982" 
    s ^XNAME(4)="PETER LIKES PIZZA AND FRENCH FRIES'. PETER" 
    s ^XNAME(5)="THE PETER WROTE A BOOK CALLED PETER ADVENTURES." 
    s ^XNAME(6)="THE PETER HAD THREE KIDS.' PETER JR AND PETER III"
    s ^XNAME(7)="PETER MARRIED MARY."
    s i=$O(^XNAME(""))
    while i'="" {
        s ^XNAME(i)=..Replace(^XNAME(i),"PETER","PAUL")
        s i=$O(^XNAME(i))
        }
    q
}

ClassMethod Replace(str, from, to As %String)
{
        while $F(str,from) {
            s str=$P(str,from)_to_$P(str,from,2,$L(str,from))
            }
        quit str
}
于 2016-03-28T21:35:02.913 に答える
0

残念ながら、まだコメントを投稿することはできません。これは、以前のソリューションへのコメントと、Cache によって生成された実際のおたふく風邪についての質問のようなものであるはずでした。したがって、以前のソリューションにはバグがあると思うので、誰かが返信して私の疑わしい以下を確認していただければ幸いです。

したがって、キャッシュが以下のソリューションをコンパイルすると仮定します。

ClassMethod Replace(str, from, to As %String)
{
        while $F(str,from) {
            s str=$P(str,from)_to_$P(str,from,2,$L(str,from))
            }
        quit str
}

このようなものに:

REPLACE(str,from,to)
        ;
        F I=1:1 Q:'$F(str,from)  D
        .       S str=$P(str,from)_to_$P(str,from,2,$L(str,from))
        Q str

このコードには重大なバグがあり、実際のfrom変数が に含まれていると無限ループが発生しますto

たとえば、「LISA」を「ELISA」、「ELISABETH」、「ALISA」、「MELISA」に変更します。

以下の例では、DAN を DANIEL に変更しています。

GTM でテスト済み (ループは 10 回の反復後に手動で中断されます。それ以外の場合は無限になります):

GTM>W $$REPLACE^ZZTEST("DAN SMITH","DAN","DANIEL")
DANIELIELIELIELIELIELIELIELIELIEL SMITH

これを念頭に置いて、私は次のようなものを提案します:

REPLACE2(str,from,to)
        ;
        N str2
        S str2=""
        F I=1:1:$L(str,from)-1 D
        .       S str2=str2_$P(str,from)_to
        .       S str=$P(str,from,2,$L(str,from))
        ;add the last piece if it exists or in case nothing to replace add all.
        Q str2_str

GTM でテスト済み:

GTM>W $$REPLACE2^ZZTEST("DAN SMITH","DAN","DANIEL")
DANIEL SMITH
GTM>W $$REPLACE2^ZZTEST("DAN SMITH DAN","DAN","DANIEL")
DANIEL SMITH DANIEL
GTM>W $$REPLACE2^ZZTEST("DAN SMITH DAN DAN DAN","DAN","DANIEL")
DANIEL SMITH DANIEL DANIEL DANIEL
GTM>W $$REPLACE2^ZZTEST("DAN SMITH DAN DAN DAN","DANA","DANIEL")
DAN SMITH DAN DAN DAN

もちろん、LISABETHという名前が生成されるなどのバグがまだ含まれているため、それは最終的な解決策にはなりません....

GTM>W $$REPLACE2^ZZTEST("ELISABETH SMITH","ELISA","LISA")
LISABETH SMITH
GTM>W $$REPLACE2^ZZTEST("ELISA ELISABETH SMITH ELISA","ELISA","LISA")
LISA LISABETH SMITH LISA
GTM>W $$REPLACE2^ZZTEST("ELISA ELISABETH SMITH ELISA"," ELISA","LISA")
ELISALISABETH SMITHLISA
GTM>W $$REPLACE2^ZZTEST("ELISA ELISABETH SMITH ELISA"," ELISA ","LISA")
ELISA ELISABETH SMITH ELISA
GTM>W $$REPLACE2^ZZTEST("ELISA ELISABETH SMITH ELISA"," ELISA","LISA")
ELISALISABETH SMITHLISA
GTM>W $$REPLACE2^ZZTEST("ELISA ELISABETH SMITH ELISA","ELISA ","LISA")
LISAELISABETH SMITH ELISA

この問題を回避するには、名前が先頭にある場合は「NAME」、末尾にある場合は「NAME」、そうでない場合は中間にある「NAME」であることを理解するために、追加のロジックを追加する必要があります。

次のようなもの(おそらく最適化できます):

REPLACE2(str,from,to)
        ;
        N from2,str2
        S str2=""
        S from2=" "_from_" "
        ; check if string begins with name
        I $E(str,1,$L(from))_" "=(from_" ") S str2=to,str=$E(str,$L(from)+1,$L(str))
        ; search for name with spaces
        F I=1:1:$L(str,from2)-1 D
        .       S str2=str2_$P(str,from2)_" "_to
        .       S str=" "_$P(str,from2,2,$L(str,from2))
        ; check if finishes with name
        I $L(str)>=$L(from) D
        .       I $E(str,$L(str)-$L(from),$L(str))=(" "_from) S str2=str2_$E(str,1,$L(str)-$L(from))_to,str=""
        .
        Q str2_str      ;add the last piece if it exists

GTM でのテスト:

GTM>W $$REPLACE2^ZZTEST("MELISA ELISA ELISABETH ALISA ELISA","ELISA","LISA")
MELISA LISA ELISABETH ALISA LISA
GTM>W $$REPLACE2^ZZTEST("MELISA ELISA ELISABETH ALISA ELISA","LISA","ELISA")
MELISA ELISA ELISABETH ALISA ELISA
GTM>W $$REPLACE2^ZZTEST("LISA MELISA ELISA ELISABETH LISA  ALISA LISA","LISA","ELISA)
ELISA MELISA ELISA ELISABETH ELISA  ALISA ELISA
GTM>W $$REPLACE2^ZZTEST("LISA MELISA ELISA ELISABETH LISA ALISA LISA","LISA","ELISA)
ELISA MELISA ELISA ELISABETH ELISA ALISA ELISA

ただし、次のような入力を決定または受け取った場合、すべてのニーズに対応できない場合があります。

GTM>W $$REPLACE2^ZZTEST("ELISA,SMITH","ELISA","LISA")
ELISA,SMITH
于 2016-03-29T19:31:24.047 に答える
0

Mumps 開発委員会の議事録で引用されている標準の REPLACE は、$$REPLACE^XLFSTR() にあります。私はprintfエミュレーターとして非常に頻繁に使用しています。

REPLACE(IN,SPEC) ;MDC 分の $$REPLACE を参照してください。
         Q:'$D(IN) "" Q:$D(SPEC)'>9 IN N %1,%2,%3,%4,%5,%6,%7,%8
         S %1=$L(IN),%7=$J("",%1),%3="",%6=9999 FS %3=$O(SPEC(%3)) Q:%3 ="" S %6(%6)=%3,%6=%6-1
         F %6=0:0 S %6=$O(%6(%6)) Q:%6'>0 S %3=%6(%6) D:$D(SPEC(%3))# 2 RE1
         S %8="" F %2=1:1:%1 D RE3
         Q %8
         ;
RE1 S %4=$L(%3),%5=0 FS %5=$F(IN,%3,%5) Q:%5

使い方の参考記事は以下です。

http://hardhats.org/kernel/html/x-replace%5Exlfstr.shtml

于 2016-03-29T20:55:52.693 に答える