Cobol 如何从三个变量中生成一个字符串?

Cobol 如何从三个变量中生成一个字符串?,cobol,Cobol,我想将三个字段合并成一个字段,在Cobol中每个单词之间只有一个空格。我希望这是下面的正确格式 STRING SORT-WORKER-LAST SPACE SORT-WORKER-FIRST SPACE SORT-WORKER-MID SPACE DELIMITED BY SIZE INTO REC-VSAM-NAME 这不起作用:

我想将三个字段合并成一个字段,在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
上面的代码也没有给出我想要的信息。

试试看

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

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

当在字符串语句中使用比喻性的常量空格或空格时,它们是等价的,复数意思是除了人类阅读之外没有任何东西,只有一个字节的长度

你可能还没做完这件事。若源字段包含嵌入的空格,那个么最好放弃字符串并做其他事情

如果你继续使用String,或者还有另一个时间你想考虑使用它,那么你也必须考虑输出字段的长度。如果你对此不采取任何行动,它将被悄悄地截断

我已经包括了一个如何做某事的例子。注意,字符串现在有一个conditional元素,因此您必须通过END-STRING(也可以是,但俗气的)来限定字符串的范围,并使用句号/句号

如果在逻辑上不能破坏输出,则不需要ON溢出。另外,如果你被告知要做的只是截断,那么它可以省略,尽管我倾向于至少对它们进行计数,并在程序结束时显示计数。然后,当分析师说,不会有,只要截断,如果有你可以回去说,有3931当你做你的容量测试

正如斯科特内尔森在一篇评论中指出的那样,使用STRING有几件事需要注意。这里您关心的是,只有字符串选择的数据才会出现在您的输出字段中,您的输出字段不会像在MOVE语句之后那样被空格填充

因为到目前为止您一直在使用固定长度字段,所以不会注意到这一点。一旦进行了更正,如果您没有先将输出字段设置为空格,您可能会发现,您有一个混合值,其中一些值是前一个内容的剩余值

另一个带字符串的是指针

如果这是您想要的,那么字符串工作方式的效果非常有用。当你不想采取行动时,你只需要知道如何避免这些事情

每次你在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 
       . 

为了完整性起见,如果您希望能够处理具有嵌入空格的数据字段,即包含多个单词的文本字段,则可以执行以下操作:

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.
例如,当分拣员最后一次包含像VAN DYKE这样的东西时,这就可以应付了

如果不想修改现有的SORT-WORKER-*字段,则必须将每个字段移动到单独的字段中,并检查这些字段,然后将它们串起来

这里要做的是将每个字符串转换为等价的“C”——以NUL结尾


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

我运行了代码,但上述两种格式都不起作用。我现在正在运行这个示例。我想在名称TEST t之间留一个空格这些是名称。如果可以嵌入空格,字符串将不会给出正确的结果。乔·玛丽亚·德·苏萨。要做的事情是写一个小程序来检查你的数据。你可能会很幸运,但名字有一个习惯,不仅仅是翻滚和合作。取决于来源,以及它们是否已在系统中清理。记住,如果系统允许,简单的打字可以在任何地方留下空格。还请记住,您可能会影响输出的长度,因此您应该对此进行检查。没有嵌入空格。我现在可以用了。我把大小分隔的空格误认为是一个参数,只把它放在最后。一旦我意识到这是它自己的一个实际参数,它现在就可以工作了。也许是修剪的好时机,但道格正在使用的主机上没有。不可能。:-在修剪上就是这样。谢谢你的提醒。是的,我又看了一遍。糟糕的建议,错误的建议。对不起,我没看就想到了这个:-谢谢。它起作用了。如果你愿意的话,你可以在上面放几行代码吗。我可以想象它的工作原理与现代语言中的试捕类似。@DougHauf鳕鱼的数量没有真正的限制
e您可以将其放在溢出的范围内。就我个人而言,我会设置一个标志,然后测试它是否涉及业务逻辑。我对试捕的了解还不够,无法给出确切的答案,但我怀疑它们是否相似。ON是指在这个特定的点上这是真的,没有其他的,这样做。ON本身的作用域也可以由NOT ON限制,其样式类似于READ,但NOT ON必须由作用域结束端字符串限制。COBOL中的作用域可能不是您所理解的其他地方的作用域。不要忘记将空格移到STRING语句之前的所有部分,因为STRING语句不会用空格填充结果字段。@ScottNelson很好。我想这已经完成了。刚刚意识到你已经指出了它,它不会出现,因为所讨论的字符串的长度实际上是固定的,所以总是会覆盖所有的内容。现在它不会。。。很快点击编辑。谢谢。我有个问题,比尔。您是否经常使用自然编程语言。我需要拿一个dob 20140630,把它翻过来,这样它就是mm dd yyyy。有没有一种方法可以像在Cobol中一样,在一天中的自然状态下获得不同的位置。