1
10
首先,荣誉,因为许多人会用两个空格来分隔,而根本不担心可能的后果。注意,如果数据后面只有一个尾随空格,那么也会得到“意外”的输出。还要注意,OUTPUT-STRING的字段定义短了一个字节,因为您插入了一个空格来分隔数据。如果两个字段都完全填充了数据,则将丢失SECOND-STRING的最后一个字节。 COBOL是一种固定长度字段的语言(可变字段除外)。这意味着没有“标准”分隔符,因此任何字符或值都可以出现在字段中的任何位置。此外,源字段比目标字段短的默认填充字符是空格,这是一个非常正常的单词分隔符。 在您和许多类似的情况下,您需要知道字段的实际数据部分的长度(不包括尾随空格)。 一种非常常见的方法是@user4341206在他们的回答中建议的, https://stackoverflow.com/a/31938039/1927206 .
根据1985年COBOL标准,INSPECT可用于计数
主要的
空格,但不能用于计数
拖尾的,拖尾的
空间。
一旦知道尾随空格的数量,就可以使用
一旦您确定了数据的长度,并记住它可能是空白的(取决于数据的可能性),并且它可能与字段的长度相同 请注意,如果您有大量数据,您可能不希望反转字段并使用INSPECT(可能是一个运行时例程),而不是从字段末尾开始的简单循环来计算尾随空格。 注意,像AcuCOBOL(现在是MicroFocus COBOL产品的一部分)这样的编译器有一个语言扩展,它提供TRAILING作为INSPECT的选项。注意,即使是2014 COBOL标准也没有TRAILING作为INSPECT的选项。 无论哪种方式,都要根据数据的长度。某种程度上。 可以在STRING语句中使用引用修改:
注意,您应该能够删除BY SIZE,因为SIZE是默认值,但它确实使读者更清楚。 您也可以在目标字段上使用带有引用修改的MOVE:
引用修改有一个特殊的问题(在另一个答案中提到),即长度字段不应为零。
本文中的长度是第二项,在
潜在的问题在于:
因此,根据您的数据(如果它可能包含空格),您必须“保护”它。
如果使用长度为零的引用修改,则结果是未定义的,尽管它可以在编译器中“工作”。 STRING和可变长度字段的解决方案不会“失败”,因为编译器在引用修改之外对零长度项很满意。 然而,出于两个原因,应该使用相同的“保护”:您将插入前导空格(“分隔符”);您将使代码显式,这样人们就不必问自己“当第一个字段为空时会发生什么”;您将节省处理时间。 这样,您的程序也可以更好地“描述您的数据”。除了“了解您的数据”作为准确程序设计的必要条件外,您的程序对数据的描述越多,就越难产生委托或遗漏的错误,就越容易理解,当数据结构发生变化时,也就越容易改变。 您还可以使用WITH POINTER选项查看STRING。首先,将FIRST-STRING移动到OUTPUT-STRING(这也会将OUTPUT-STRING中未使用的字节清除到空格)。然后在您定义的长度字段中添加一个(用于中间空格),并在STRING中使用该字段作为WITH POINTER。 虽然这是完全有效的,但如果使用,这是一个发表评论的机会,因为许多经常使用STRING的人不知道WITH POINTER的用法,所以请帮助他们。 另一种可能性是使用可变长度字段。 不幸的是,并不是所有的COBOL编译器都能做到这一点。“复杂的ODO”是非标准的,但它是该语言的IBM扩展。
如果您有大量数据,最快的方法是仅参考修改建议。我对引用修改的看法是,它倾向于混淆,因为人们倾向于以混淆(和不必要)的方式使用它。 我倾向于最后一种,其中PROCEDURE DIVISION代码非常简单:您可以在第一个字段中找到数据的长度;你只做三个简单的动作。 也许你可以尝试每一种方法,以更加了解未来情况的可能性。 |
2
7
我不知道这是否对您有帮助,但如果您想删除第一个字符串的尾随空格,可以在插入字符串之前执行以下操作:
|
3
0
我更喜欢内联执行来查找数据的长度,去掉尾部空格。最小长度1将允许字符串命令成功,即使数据是所有空格。
|
user5858 · Matlab-按分隔符拆分单元格数组列 7 年前 |
Zdiode · 查找开始和停止之间的所有重复字符串,并使用分隔符 7 年前 |
Matt · 显示错误结果的自定义toString(char)方法 7 年前 |
Haddock-san · 正则表达式量词-两个字符之间的数量 7 年前 |
Aman Singh Dhir · VBA文本到以括号作为拆分器的列 7 年前 |