2016-03-25 22 views
0

"STS ++ 5623 + 56 + 123" 'deki "56" dizinini bulmak istiyorum. Ben yazdım kod bana (5623 arasında) 6 verir ama 11.Ayraç 4:

DEFINE var v-segment as longchar no-undo. 
DEFINE VARIABLE v-element AS CHARACTER NO-UNDO. 
ASSIGN v-segment = "STS++5623+56". 
ASSIGN v-element = "56". 

define variable v-index as integer no-undo. 

v-index = index(v-segment , v-element , 1). 

MESSAGE v-index 
    VIEW-AS ALERT-BOX INFO BUTTONS OK. 
+1

Başlığınızda "ayırıcılarla ayrılmış" yazıyor. Ancak sorunun bedeni sınırlayıcıların ne olduğunu ve neden önemli olduklarını göstermez. Neden 6'dan niçin mutsuz olduğunuzu ve 11'in daha iyi bir cevap verdiğini de açıklamıyor musunuz? İhtiyacınızı yorumlamanın bir yolu, ilkinden ziyade "56" nın ikinci örneğini istemektir. Ama gerçekliğin bundan daha karmaşık olduğundan şüpheleniyorum. –

cevap

0
DEFINE var v-segment as longchar no-undo. 
DEFINE VARIABLE v-element AS CHARACTER NO-UNDO. 
def var v-i as int no-undo. 
def var v-data as char no-undo. 

ASSIGN v-segment = "STS++5623+56+123". 
ASSIGN v-element = "56". 

define variable v-index as integer no-undo. 

do v-i = 1 to num-entries(v-segment,"+"): 

    if entry(v-i,v-segment,"+") = v-element then 
    do: 

    v-data = entry(v-i,v-segment,"+"). 

    MESSAGE v-data VIEW-AS ALERT-BOX INFO BUTTONS OK. 

    end. 

end. 
0

bu yaklaşım çeşitli yolları vardır gerekir. Hangisi en akıllısa verilere bağlıdır. Aradığın şey olabilir, ilmikleri içermeyen ikiyi düşünebilirim. Herhangi bir kıyaslama yapmamıştım, ancak aşağıdaki kodun en verimli algoritma olacağını düşünüyorum. En fazla üç dize arama içerir: bir entry(), bir num-entries() ve bir index(). Bu sizin ihtiyaçlarınızı karşılamıyorsa alternatifler önerebilirim.

DEFINE VARIABLE v-segment AS LONGCHAR NO-UNDO. 
DEFINE VARIABLE v-element AS CHARACTER NO-UNDO. 
DEFINE VARIABLE v-index AS INTEGER NO-UNDO. 
DEFINE VARIABLE v-entry AS INTEGER NO-UNDO. 
DEFINE VARIABLE v-delim AS CHARACTER NO-UNDO. 

ASSIGN v-segment = "STS++5623+56" 
     v-element = "56" 
     v-delim = "+". 

/* Does the segment contain the exact entry? */ 
v-entry = LOOKUP(v-element, v-segment, v-delim). 

/* 
** If entry number = 0, then element is not found 
** If entry number = 1, then element is at beginning of segment. 
** If entry number = num-entries(), then element is at end of segment 
** Otherwise, element is in the middle; just search for it surrounded 
** by delimters. 
*/ 

IF v-entry = 0 THEN 
    v-index = 0. 
ELSE IF v-entry = 1 THEN 
    v-index = 1. 
ELSE IF v-entry = NUM-ENTRIES(v-segment, v-delim) THEN 
    v-index = R-INDEX(v-segment, v-delim) + 1. 
else              
    v-index = INDEX(v-segment, v-delim + v-element + v-delim) + 1. 

MESSAGE v-index VIEW-AS ALERT-BOX INFO BUTTONS OK. 
+0

Bu "STS ++ 5623 + :: 56" için çalışmıyor: başka bir sınırlayıcı. Bahsetmeyi unuttum: Başka bir olası sınırlayıcı olabilir, – mac100

+0

Problem için başka önemli özellikler var mı? Özellikle: tüm sınırlayıcılar tek karakterli mi? –

+0

Ayrıca: UTF-8 gibi çok baytlı karakterleri destekleyen bir çözüme mi ihtiyacınız var? –

1

Üzgünüz, önceki cevap ihtiyacınız olan şey değildi. Onu bırakmaya karar verdim, çünkü belirtildiği gibi problem için güzel bir çözüm. Ama tekrar deneyeceğim. Sınırları kontrol etmeyi ayrı bir işlev yaptım, böylece gereksinimlerinize kolayca uyarlayabilirsiniz. Çoklu bayt karakter yetenekleri eklemek kolay olmalıdır.

DEFINE VARIABLE v-segment AS LONGCHAR NO-UNDO. 
DEFINE VARIABLE v-element AS CHARACTER NO-UNDO. 
DEFINE VARIABLE v-delims  AS CHARACTER NO-UNDO. 

DEFINE VARIABLE v-index  AS INTEGER NO-UNDO. 
DEFINE VARIABLE v-delimCount AS INTEGER NO-UNDO. 
DEFINE VARIABLE v-segLength AS INTEGER NO-UNDO. 
DEFINE VARIABLE v-eltLength AS INTEGER NO-UNDO. 
DEFINE VARIABLE v-psn  AS INTEGER NO-UNDO. 

ASSIGN v-segment = "STS++5623+56" 
     v-element = "56" 
     v-delims  = "+:" 
     /* For efficiency, don't calculate these inside your loop */ 
     v-seglength = LENGTH(v-segment) 
     v-eltLength = LENGTH(v-element) 
     v-delimCount = LENGTH(v-delims). 


/* 
** isDelin() 
** Is character at specified positiion one of the delimiters? 
** 
** Params: 
** CHARACTER p-str - string to search 
** INTEGER p-psn - position to check 
** CHARACTER p-delims - list of delimiters to check for 
** 
** Returns TRUE if character at specified position is a delimiter 
** Otherwise, returns FALSE 
*/ 
FUNCTION isDelim RETURNS LOGICAL (
    INPUT p-str  AS LONGCHAR, 
    INPUT p-psn  AS INTEGER, 
    INPUT p-delims AS CHARACTER 
): 

    /* You might want parameter checking here.... */ 
    RETURN INDEX(p-delims, SUBSTRING(p-str, p-psn, 1)) > 0. 

END FUNCTION. /* isDelim */ 

/* 
** You might want special case handling here: 
** if v-eltLength = 0 then v-index = 1. return. 
** IF v-element = ? or v-segment = ? then v-index = 0. return. 
*/ 

/* Look for v-element, then see if it is surrounded by delimiters */ 
v-index = 0. 
DO WHILE TRUE: 

    v-index = INDEX(v-segment, v-element, v-index + 1). 
    If v-index = 0 THEN LEAVE. /* No more matches */ 

    /* 
    ** Found a match. Is it preceded by a delimiter? 
    ** (Don't check if match is at beginning of string.) 
    */ 
    v-psn = v-index - 1. 
    IF v-psn > 0 AND NOT isDelim(v-segment, v-psn, v-delims) THEN NEXT. 

    /* 
    ** Is match followed by a delimiter? 
    ** (Don't check if match is at end of string.) 
    */ 
    v-psn = v-index + v-eltLength. 
    IF v-psn > v-seglength THEN LEAVE. 

    IF NOT isDelim(v-segment, v-psn, v-delims) THEN NEXT. 

    /* Success! */ 
    LEAVE. 
END. 

MESSAGE v-index VIEW-AS ALERT-BOX INFO BUTTONS OK. 
+0

Teşekkürler, tam olarak aradığım şey :) – mac100

+0

Bunu duyduğuma sevindim. Bunu çözmek için cevabı kontrol etmelisiniz; Bu, gelecekteki aramaların yerini bulmasını kolaylaştırır. –