如何从三个变量中创建一个字符串?

时间:2014-04-29 19:41:22

标签: cobol

我想在一个字段中创建三个字段,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

以上代码并没有给我提供我想要的东西。

4 个答案:

答案 0 :(得分: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 :(得分:3)

当在STRING语句中使用时,比喻常量SPACE(或空格,它们是等价的,复数表示除了人类阅读之外的任何内容)都有一个字节的长度。

您可能还没有完成此操作。如果源字段包含嵌入空格,则最好放弃STRING并执行其他操作。

如果您继续使用STRING或者还有其他时间想要考虑使用它,那么您还必须考虑输出字段的长度。如果你对它没有做任何事情,它将被悄然截断。

我已经提供了一个如何做某事的例子。请注意,STRING现在有一个条件元素(ON),因此您必须通过END-STRING界定STRING的范围(也可以,但是粘性,具有完全停止/句点)。

如果逻辑上不能破坏输出,则不需要ON OVERFLOW。此外,如果您被告知要做的是“只是截断”,那么它可以省略,虽然我倾向于至少计算它们,并在程序结束时显示计数。然后,当分析师说,“没有任何东西,只要截断,如果有”,你可以回去说当你进行体积测试时有3,931。

正如ScottNelson在评论中指出的那样,STRING有几点需要注意。您在此担心的是,只有STRING选择的数据才会出现在您的输出字段中,您的输出字段将进行空格填充,就像在MOVE语句之后一样。

因为到目前为止你一直在使用固定长度的字段,所以你不会注意到这一点。一旦进行了更正,您可能会发现,如果您没有首先将输出字段设置为SPACE,那么您将混合使用值,其中一些值会从之前的内容中遗留下来。

STRING的另一个是POINTER。

如果你想要的话,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 
       . 

答案 2 :(得分:1)

尝试

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

答案 3 :(得分: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包含类似&#34; VAN DYKE&#34;

的内容时,这将会应付。

如果您不想修改现有的SORT-WORKER-*字段,则必须将每个字段移至单独的字段INSPECT然后STRING这些字段

你在这里做的是将每个字符串转换为&#39; C&#39;等价物 - 由NUL终止。

当然,这取决于你的Cobol是否足够新。