2016-11-13 3 views
0

Je suis un débutant de l'apprentissage de Progress OpenEdge. J'ai une question sur la façon de diviser une entrée de chaîne de l'utilisateur pour obtenir la sortie avec le délimiteur en une seule procédure.Code pour séparer la chaîne de délimitation

Par exemple,

Avec entrée

"A0020000A103A0A0A0A501A4A405A5A5A5A5A5" 

La sortie doit être:

HEADER LEN DATA 
------------- ------ -------------- 
A0    02 0000 
A1    03 A0A0A0 
A5    01 A4 
A4    05 A5A5A5A5A5 

Ou

Avec entrée:

"B103X0X0X0C204B1B1B1B1A209C2C2C2C2C2C2C2C2C2X301A2" 

Sortie:

HEADER LEN DATA 
------------- ------ ----------------------- 
B1    03 X0X0X0 
C2    04 B1B1B1B1 
A2    09 C2C2C2C2C2C2C2C2C2 
X3    01 A2 
+0

Avec vos exemples, on peut dire qu'il peut y avoir exactement 2 chara cters pour "Header" et "Len". Mais, comment décidez-vous du nombre de caractères pour "Data". Il devrait y avoir quelques critères pour diviser la chaîne. Quels sont les critères? Et, avez-vous écrit du code pour y parvenir? Si oui, postez le code. La version d'OpenEdge et les informations sur le système d'exploitation seront également utiles aux autres pour vous suggérer quelque chose. – Austin

Répondre

1

J'ai essayé de désosser vos besoins de votre sortie.

Il semble que les données sont en blocs de deux caractères. Un "en-tête" suivi d'un champ "compteur" et ensuite de nombreux champs "données" à deux caractères que le compteur indique.

Cela semble briser la chaîne de la manière que vous désirez:

define variable data as character no-undo format "x(60)". 

function getElements returns integer (input str as character): 
    return integer(substring(str, 1, 2)). 
end. 


function getData returns character (input str as character): 
    return substring(str, 3, getElements(str) * 2). 
end. 

procedure parse: 

    define input parameter str as character no-undo. 

    define variable ii as integer no-undo. 
    define variable jj as integer no-undo. 

    define variable nn as integer no-undo. 

    nn = length(str). 
    ii = 1. 

    do while ii < nn: 

    display 
     substring(str, ii, 2) 
     substring(str, ii + 2, 2) 
    . 

    data = getData(substring(str, ii + 2)). 

    display data. 

    pause. 

    ii = ii + 4 + length(data). 

    end. 

    return. 

end. 

run parse ("A0020000A103A0A0A0A501A4A405A5A5A5A5A5"). 
run parse ("B103X0X0X0C204B1B1B1B1A209C2C2C2C2C2C2C2C2C2X301A2"). 

return. 
1

La même chose que la réponse de Tom, mais sans les fonctions et la mise en forme d'affichage.

procedure parse: 
    define input parameter i_c as character no-undo. 

    def var itotal as int no-undo. 
    def var ipos as int no-undo initial 1. 

    def var cheader as char no-undo label "Header" format "x(2)". 
    def var ilen as int no-undo label "Len" format "99". 
    def var cdata as char no-undo label "Data" format "x(50)". 

    itotal = length(i_c). 

    repeat while ipos < itotal: 

    assign 
     cheader = substring(i_c, ipos, 2) 
     ilen = integer(substring(i_c, ipos + 2, 2)) 
     cdata = substring(i_c, ipos + 4, 2 * ilen)    
     ipos = ipos + 4 + ilen * 2 
     . 

    display 
     cheader 
     ilen 
     cdata 
    with width 70. 

    end. 

end procedure. 

run parse ("A0020000A103A0A0A0A501A4A405A5A5A5A5A5"). 
run parse ("B103X0X0X0C204B1B1B1B1A209C2C2C2C2C2C2C2C2C2X301A2"). 
  • variables avec les étiquettes et les formats utilisés
  • répétition a la gestion des blocs afin que tous les enregistrements sont présentés ci-dessous les uns des autres
  • Je suis pleinement conscient que Tom se plaindra du nom de variable préfixes de type de données, mais ils battent l'enfer sur ii, jj et nn et en utilisant des noms convulsés pour éviter un conflit avec un mot-clé de progrès ne vaut tout simplement pas (imho)
+1

Maintenant je suis obligé de me plaindre;) Normalement, je dirais juste "je" et "j" mais je trouve que l'idée de ii et jj est beaucoup plus rechercheable pour être attrayante alors je pensais que essayez-le, voyez à quoi ça ressemble et vérifiez si mes doigts brûlent après l'avoir tapé. –

+1

Les variables à caractère unique sont une abomination qui aurait dû disparaître lors de l'introduction de cpus 16 bits. Une autre option pour l'option de compilation stricte ;-) –

+1

J'ai toujours aimé i, j et k pour les compteurs de boucles :) –