2014-04-29 112 views
0

我想將三個字段放在一個字段中,Cobol中的每個單詞之間只有一個空格。我這下面如何從三個變量中創建一個字符串?

STRING SORT-WORKER-LAST SPACE  
     SORT-WORKER-FIRST SPACE  
     SORT-WORKER-MID SPACE  
     DELIMITED BY SIZE    
     INTO REC-VSAM-NAME  

正確的格式這不起作用:

STRING SORT-WORKER-LAST SPACE  
      SORT-WORKER-FIRST SPACE  
      SORT-WORKER-MID SPACE  
     DELIMITED BY space    
     INTO REC-VSAM-NAME   

    STRING SORT-WORKER-LAST   
      SORT-WORKER-FIRST   
      SORT-WORKER-MID   
     DELIMITED BY space    
     INTO REC-VSAM-NAME  

不工作要麼。

 SS5726 test    test   t 

    " " DELIMETED BY SPACE 

上面的代碼並沒有給我我正在尋找什麼。

+0

我跑的代碼都沒有上述格式的工作。我現在正在運行這個例子。我想要名稱之間有一個空格TEST TEST T –

+0

這些是名字。如果可以嵌入空格,STRING將不會給你正確的結果。 'JOAO MARIA DE SOUSA'。要做的事情是寫一個小程序來檢查你的數據。你可能會很幸運,但名字有一個習慣,不只是滾動和合作。取決於源代碼,以及它們是否已在系統中「清理」。簡單的錯字可以在任何地方得到空間,記住,如果系統允許的話。另外請記住,你可能會吹出你輸出的長度,所以你應該檢查一下。 –

+0

沒有嵌入式空間。我現在正在工作。我錯誤地將「SIZE DELIMITED BY SIZE」作爲單個參數,只是將其放在最後。一旦我意識到這是它自己的實際參數,它現在可以工作。 –

回答

3

當在一個字符串的說法,比喻常SPACE(使用或空間,它們是等效的,複數意味着什麼,除了人讀取)具有一個字節的長度。

您可能未完成此操作。如果您的源字段包含嵌入的空格,則最好放棄STRING並執行其他操作。

如果您繼續使用STRING或有其他時間想要考慮使用它,那麼您還必須考慮輸出字段的長度。如果你沒有做任何事情,它會被安靜地截斷。

我已經包含了一個如何做某事的例子。請注意,STRING現在具有一個條件元素(ON),所以您必須通過END-STRING(也可能,但很俗氣,以全站/句點)劃分STRING的範圍。

如果在邏輯上不能破壞輸出,則不需要ON OVERFLOW。另外,如果你被告知要做的只是「截斷」,那麼它可以被省略,儘管我傾向於至少對它們進行計數,並在程序結束時顯示計數。然後,當分析師說,「不會有任何,只是截斷,如果有的話」,你可以回去說,當你進行音量測試時,有3931。

正如ScottNelson在評論中指出的那樣,STRING有幾個值得注意的地方。這裏所關心的是,只有STRING選擇的數據纔會出現在輸出字段中,您的輸出字段將爲而不是爲空格填充,因爲它在MOVE語句之後。

因爲到目前爲止您一直在使用固定長度的字段,所以您不會注意到這一點。一旦你有了修正,你可能會發現,如果你沒有把輸出字段設置爲空格,你會得到一個混合的值,剩下的內容就是一些。

另一個與STRING是指針。

如果這是您想要的,STRING方式的效果非常有用。當你不想要這樣的行爲時,你只需要知道該怎麼做才能避免這些事情。

每當您在COBOL中發現新內容時,請點擊該手冊。語言參考第一。試着去了解。編程指南。嘗試更多。如果不確定,試驗。閱讀手冊。實驗。繼續直至被理解。

每次我閱讀手冊時,我都會嘗試着去看看別的東西。一種瞭解語言的技巧就是知道可以完成的事情的類型,知道在哪裏找到細節,以及如何理解解釋。

你會發現與所有「複雜」的COBOL動詞類似的東西,STRING,UNSTRING,INSPECT。他們的行爲似乎最初對你有效,但在你需要時,這些行爲是有用的,否則不可用。

IDENTIFICATION DIVISION. 
    PROGRAM-ID. DOUGH. 
    DATA DIVISION. 
    WORKING-STORAGE SECTION. 
    01 PART-1 PIC X(30) VALUE "TEST". 
    01 PART-2 PIC X(30) VALUE "TEST". 
    01 PART-3 PIC X(30) VALUE "T". 
    01 ALL-PARTS PIC X(30). 
    PROCEDURE DIVISION. 
     MOVE SPACE TO ALL-PARTS 
    * MOVE ZERO TO data-name-used-with-POINTER 
    * (if used)         
     STRING PART-1 DELIMITED BY SPACE 
       SPACE DELIMITED BY SIZE 
       PART-2 DELIMITED BY SPACE 
       SPACE DELIMITED BY SIZE 
       PART-3 DELIMITED BY SPACE 
     INTO ALL-PARTS 
     ON OVERFLOW 
      DISPLAY "SORRY, YOUR DATA WAS TRUNCATED" 
     END-STRING 

     DISPLAY 
      ">" 
       ALL-PARTS 
      "<" 
     GOBACK 
     . 
+0

謝謝。有用。如果你願意,溢出是否可以放在顯示器之外,你可以在那裏放幾個代碼。我會想象它的作用類似於現代語言中的嘗試捕捉。 –

+0

@DougHauf在ON OVERFLOW範圍內可以放入的代碼量沒有實際限制。就個人而言,如果涉及商業邏輯,我會設置一個標誌並在之後進行測試。我不太瞭解一個試圖抓住最終答案,但我懷疑他們是相似的。 ON是「當在這個特定點上這是真的,而沒有其他的時候,這樣做」。 ON本身的範圍也可以通過NOT ON進行限制,與READ類似,但是NOT ON必須受END-STRING結束限制。 COBOL中的作用域可能不是你在別處理解的範圍。 –

+1

不要忘記在'STRING'語句之前'將空間移動到所有部分',因爲'STRING'語句不會在空格中填充結果字段。 –

1

嘗試

STRING 
    field-1 DELIMITED BY SIZE 
    " " DELIMITED BY SIZE 
    field-2 DELIMITED BY SIZE 
    INTO big-field 
+0

沒有布賴恩。也許是TRIM的好時機,但我們沒有在Doug使用的大型機上使用它。 –

+0

沒辦法。 :-)(在TRIM上)。謝謝Bill的提高。是的,又看了一遍。不好的建議,錯誤的建議。 –

+0

對不起,我正在考慮這一個沒有看它:-) http://stackoverflow.com/a/13980135/1927206 –

3

嘗試....

STRING SORT-WORKER-LAST DELIMITED BY SPACE 
     " " DELIMITED BY SIZE 
     SORT-WORKER-FIRST DELIMITED BY SPACE 
     " " DELIMITED BY SIZE 
     SORT-WORKER-MID DELIMITED BY SPACE 
    INTO REC-VSAM-NAME 
1

只是爲了完整性起見,你可以做以下的,如果你希望能夠應付包含空格的數據字段(換句話說,文本字段包含多個單詞):

INSPECT SORT-WORKER-FIRST 
     REPLACING TRAILING SPACES BY LOW-VALUES. 
INSPECT SORT-WORKER-MID 
     REPLACING TRAILING SPACES BY LOW-VALUES. 
INSPECT SORT-WORKER-LAST 
     REPLACING TRAILING SPACES BY LOW-VALUES. 
STRING SORT-WORKER-LAST " " SORT-WORKER-FIRST " " SORT-WORKER-MID 
     DELIMITED BY LOW-VALUE INTO REC-VSAM-NAME. 

例如,當SORT-WORKER-LAST包含諸如「VAN DYKE」之類的情況時,這將會應對。

如果你不想修改現有SORT-WORKER-*領域,你必須每移動到一個單獨的領域和INSPECT然後STRING這些領域。

你在這裏做的是將每個字符串轉換爲'C'等價物 - 以NUL結尾。

當然,這取決於您的Cobol是否足夠新。

相關問題