2014-04-29 114 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是否足够新。

相关问题