2016-04-04 8 views
3

ABC + 123:xy + 123 ++ 23'EFG + 123:xy + 123 ++ 23'GHI + 123:xy + 123 ++ 23 + mki + 123'LMV ++ 123:xy'進行中の特定の条件に基づいて文字列をトリミングする方法4gl?

私は上記の文字列を持っています。アポストロフィ( ')は、セグメントの終わりを示すターミネータとして機能します。 したがって、ABC + 123:xy + 123 ++ 23はセグメントで、その開始タグは3つの文字ABCで、一意です。 ここでは、これらの開始タグに基づいてこの文字列をトリムする必要があります。たとえば、ABCとLMVで始まるセグメントが必要です。 結果の文字列は、ABC + 123:xy + 123 ++ 23'LMV ++ 123:xy '

答えて

3

である必要があります。この質問とその他の質問に基づいて、EDIFACTで作業します。

EDIFACTは、一重引用符で区切られています(必要に応じてアポストロフィ)。

ENTRYNUM-ENTRIESはあなたの友人です。私はあなたのデータを文字列、より正確には一時テーブルよりも使用可能なフォーマットに移行することをお勧めします。次に、あなたはテンポラリテーブルで何でもできます。最初にデータを "行単位"で処理するか、 "エントリ単位で入力"し、次にそれを使って必要な処理を行います。

DEFINE VARIABLE cString AS CHARACTER NO-UNDO. 
DEFINE VARIABLE iEntry AS INTEGER  NO-UNDO. 

DEFINE TEMP-TABLE ttEdifact NO-UNDO 
    FIELD lineno AS INTEGER 
    FIELD linedata AS CHARACTER FORMAT "x(60)". 

/* The string in your example ends with a delimiter (') thus your temp-table will have one empty record in the end - it could be trimmed away */ 
cString = "ABC+123:xy+123++23'EFG+123:xy+123++23'GHI+123:xy+123++23+mki+123'LMV++123:xy'". 


DO iEntry = 1 TO NUM-ENTRIES(cString, "'"). 
    CREATE ttEdiFact. 
    ASSIGN 
     ttEdifact.lineno = iEntry 
     ttEdifact.lineData = ENTRY(iEntry, cString, "'"). 
END. 

/* Now it's up to you to do something */ 
FOR EACH ttEdifact WHERE ttEdifact.lineData BEGINS "ABC": 
    DISP ttEdiFact. 
END. 
+0

はい、私はまだ私は必要な正確な情報を得るために戦って、何とか、EDIFACTと各要素の言うことを抽出することができ働いています、この質問は、解析する前に、セグメントタグをフィルタリングすることです。ありがとう。 – mac100

+0

あなたが以前にedifactで作業していて、いくつかの作業ライブラリを持っていれば、助けてくれるでしょう。 – mac100

+0

@ mac100 10年前にEDIFACTでの作業をやめました。 。 – Jensd

関連する問題