由尾随空格分隔的 Cobol 字符串

2024-04-29

WORKING-STORAGE.
    FIRST-STRING    PIC X(15) VALUE SPACES.
    SECOND-STRING     PIC X(15) VALUE SPACES.
    OUTPUT-STRING     PIC X(31) VALUE SPACES.

If FIRST-NAME = 'JON SNOW, ' and LAST-NAME = 'KNOWS NOTHING. ', 我怎样才能得到:

我想得到:

OUTPUT-STRING = 'JON SNOW, KNOWS NOTHING.         '

当我尝试时:

String FIRST-STRING DELIMITED BY SPACES
       ' ' DELIMITED BY SIZE
       SECOND-STRING DELIMITED BY SIZE
       INTO OUTPUT-STRING

I Get 'JON KNOWS NOTHING. '

当我尝试时:

String FIRST-STRING DELIMITED BY SIZE
       SECOND-STRING DELIMITED BY SIZE
       INTO OUTPUT-STRING

I get 'JON SNOW, KNOWS NOTHING. '

我发现了一个调整,其中包括String FIRST-STRING DELIMITED BY ' '(两个空格) 但不能保证我的 FIRST-STRING 不包含两个空格,这会导致丢失部分内容。


首先,值得称赞的是,许多人会选择用两个空格分隔,而根本不关心可能的后果。请注意,如果数据后仅跟一个尾随空格,您还会得到“意外”输出。另请注意,OUTPUT-STRING 的字段定义短一个字节,因为您要插入一个空格来分隔数据。由于这两个字段都完全填充了数据,您将丢失 SECOND-STRING 的最后一个字节。

COBOL 是一种固定长度字段的语言(可变长度字段除外)。这意味着没有“标准”分隔符,因此任何字符或值都可以出现在字段中的任何位置。此外,默认的填充字符(源字段比目标字段短)是空格,这是完全正常的单词分隔符。

在您和许多类似的情况下,您需要知道字段的实际数据部分的长度(不包括尾随空格)。

执行此操作的一种非常常见的方法是@user4341206 在他们的回答中建议的,https://stackoverflow.com/a/31938039/1927206 https://stackoverflow.com/a/31938039/1927206.

在1985 COBOL标准下,INSPECT可用于计数leading空格,但不能用于计数trailing空间。FUNCTION REVERSE可以首先使用将尾随空格转换为前导空格,以便 INSPECT 可以对它们进行计数。

一旦知道尾随空格的数量,就可以使用LENGTH OF特殊寄存器或FUNCTION LENGTH确定固定长度字段的长度(两者都(或者可以,取决于编译器)在编译时评估)。字段长度和尾随空格数之间的差值就是数据的长度。

一旦您知道了数据的长度,并记住它可能是空白的(取决于数据的可能性)并且它可能与字段的长度相同

请注意,如果您有大量数据,您可能不希望反转字段并使用 INSPECT(可能是运行时例程),而不是从字段末尾开始计算尾随空格的简单循环。

请注意,像 AcuCOBOL(现在是 Micro Focus COBOL 产品的一部分)这样的编译器有一个语言扩展,它提供 TRAILING 作为 INSPECT 的选项。请注意,即使是 2014 COBOL 标准也没有 TRAILING 作为 INSPECT 的选项。

无论哪种方式,只要数据的长度就完成了。有点。

您可以在 STRING 语句中使用引用修改:

String FIRST-STRING ( 1 : length-field-you-define ) DELIMITED BY SIZE
       ' ' DELIMITED BY SIZE
       SECOND-STRING DELIMITED BY SIZE
   INTO OUTPUT-STRING

请注意,您应该能够删除 BY SIZE,因为 SIZE 是默认值,但它确实使人类读者更清楚。

您还可以在目标字段上使用带有引用修改的 MOVE:

MOVE FIRST-STRING            TO OUTPUT-STRING  
                                 ( 1 : length-field-you-define )
MOVE SPACE                   TO OUTPUT-STRING  
                                 ( length-field-you-define + 1 : 1 )
MOVE SECOND-STRING           TO OUTPUT-STRING  
                                 ( length-field-you-define + 2 :  )

引用修改有一个具体问题(在另一个答案中提到),即长度字段不应为零。

长度的评估应产生一个非零正整数。

在这种情况下,长度是第二项,在:,在引用修改符号中。在这种情况下,这意味着您定义的长度字段不能为零,如果 FIRST-STRING 完全是空格,则可以计算出该值。

潜在的问题在于:

MOVE FIRST-STRING            TO OUTPUT-STRING  
                                 ( 1 : length-field-you-define )

因此,根据您的数据(如果可能包含空白),您必须“防止”这种情况。

    IF FIRST-STRING EQUAL TO SPACE
        PERFORM                  COPY-SECOND-STRING-ONLY
    ELSE
        PERFORM                  CONCATENATE-FIRST-AND-SECOND
    END-IF
    ...
COPY-SECOND-STRING-ONLY.
    MOVE SECOND-STRING           TO OUTPUT-STRING
    .
CONCATENATE-FIRST-AND-SECOND.
    calculate length
    MOVE FIRST-STRING            TO OUTPUT-STRING  
                                    ( 1 : length-field-you-define )
    MOVE SPACE                   TO OUTPUT-STRING  
                                    ( length-field-you-define + 1 : 1 )
    MOVE SECOND-STRING           TO OUTPUT-STRING  
                                    ( length-field-you-define + 2 :  )
    .

如果您使用长度为零的引用修改,则结果是未定义的,尽管它可能与您的编译器一起“工作”。

使用 STRING 和可变长度字段的解决方案不会“失败”,因为引用修改之外的编译器对零长度项感到满意。

然而,出于两个原因,应该采用相同的“保护”:您将插入一个前导空格(“分隔符”);您将使代码变得明确,这样人们就不必问自己“当第一个字段为空时会发生什么”;您将节省处理费用。

通过这种方式,您的程序也可以更好地“描述您的数据”。除了“了解你的数据”作为准确的程序设计的必要条件之外,你的程序描述的数据越多,就越难产生遗漏错误,也就越容易理解,也就越容易当数据结构发生变化时,就会发生变化。

您还可以使用WITH POINTER 选项查看STRING。首先,将 FIRST-STRING 移动到 OUTPUT-STRING(这也会将 OUTPUT-STRING 中未使用的字节清除到空间)。然后将 1 添加到您定义的长度字段(用于插入空格),并在 STRING 中将其用于WITH POINTER。

虽然这是完全有效的,但如果使用的话,这是一个发表评论的机会,因为许多经常使用 STRING 的人不知道WITH POINTER 的使用,所以帮助他们。

另一种可能性是使用可变长度字段。

不幸的是,并非所有 COBOL 编译器都能让这变得简单。 “复杂 ODO”(其最纯粹的形式)是非标准的,但它是该语言的 IBM 扩展。

LINKAGE SECTION.
01  L-MAPPING-OF-OUTPUT-STRING.
    05  L-MOOS-FIRST-STRING.
        10  FILLER OCCURS 0 TO 15 TIMES
            DEPENDING ON length-field-you-define.
            15  FILLER                          PIC X.
    05  L-MOOS-SEPARATOR-SPACE                  PIC X.
    05  L-MOOS-SECOND-STRING                    PIC X(15).

    ...
    SET ADDRESS OF L-MAPPING-OF-OUTPUT-STRING
                             TO ADDRESS OF 
                                 OUTPUT-STRING  
    MOVE FIRST-STRING        TO L-MOOS-FIRST-STRING
    MOVE SPACE               TO L-MOOS-SEPARATOR-SPACE
    MOVE SECOND-STRING       TO L-MOOS-SECOND-STRING

如果您有大量数据,最快的方法是仅参考修改建议。我对引用修改的看法是它容易混淆,因为人们倾向于以混淆(且不必要)的方式使用它。

我更喜欢最后一个,其中 PROCEDURE DIVISION 代码非常简单:您可以在第一个字段中找到数据的长度;你只需做三个简单的动作。

也许你可以尝试每一种,以更加了解未来情况的可能性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

由尾随空格分隔的 Cobol 字符串 的相关文章

随机推荐

  • Sql Server CTE“无法绑定多部分标识符。”

    我关于这个 cte 查询的最后一个问题很快就得到了回答 我想我会向你们这些 sql 专家提出下一个问题 如果我可以检查我的基本逻辑 然后显示我的代码和语法错误 任何帮助将不胜感激 我的股票交易系统有三个表 符号表 顾名思义 它是股票代码列表
  • 从相对路径读取文件

    我知道这个问题之前已经被问过 1000 次了 我确实尝试了所有解决方案 Java项目中如何从相对路径读取文件 java io File 找不到指定的路径 https stackoverflow com questions 3844307 h
  • npm 命令不显示任何输出或结果

    npm v 没有给出任何输出 https i stack imgur com 1Z5yf png 请参阅附图 我已经安装了node js 打开我的 git bash 后 如果我运行 node v 它会给我节点版本 但是在我写 npm v 后
  • 使用客户端证书身份验证连接到 Web 服务

    我得到了一个 p12 文件 用于使用客户端证书身份验证通过 SSL 连接到 Web 服务 我使用 cURL 在 PHP 中成功地工作了 这些是我在执行请求时使用的选项 headers array Method POST Connection
  • Angular2 CLI 构建异常:选择器“app-root”与任何元素都不匹配

    从头开始 安装节点 打字 角度 cli 并运行命令sudo ng new plzstart mobile创建项目 然后使用须藤构建 执行完后cd into plzstart 选择器 app root 不匹配任何元素 构建命令抛出以下异常 A
  • ORA-00972 标识符别名列名太长

    我有一个查询 例如 SELECT column as averyveryveryverylongalias more than 30 characters FROM Table name 它返回错误ORA 00972 标识符太长 有什么技巧
  • 什么是构建依赖项?

    构建依赖关系 中解释货物簿 https doc rust lang org cargo reference specifying dependencies html build dependencies 您可以依赖其他基于 Cargo 的板
  • 哪个 Haskell 计算机图形几何库?

    我想用 Haskell 做一些计算机图形学实验 这将包括进行一些几何计算并最终编写光线追踪器 我应该选择哪个库来轻松处理向量 矩阵及其相关操作 Hackage 上很少有包括像这样好看的vect http hackage haskell or
  • 我应该将 PHP include/require 语句放在 HTML 中的什么位置?

    我在文件中创建了一个 PHP 类 现在我想在 HTML 页面中使用它 我应该把它放在哪里require or includeHTML 页面内的声明 有没有表现在 HTML 的开头或结尾加载它之间的区别 还是根本没有区别 应该是在 PHP 脚
  • 我可以从 React Native 项目中删除 tvOS 吗?

    Eventually I will be submitting a react native app to the app store but the app will only run on iOS not tvOS Will I be
  • 如何将 pymongo.cursor.Cursor 转换为字典?

    我正在使用 pymongo 查询一个区域内的所有项目 实际上是查询地图上一个区域内的所有场馆 我用了db command SON 在搜索球形区域之前 它可以返回一本字典 字典中有一个名为results其中包含场馆 现在我需要在一个正方形区域
  • 在 ReportLab 中向画布元素添加超链接的最简单方法是什么?

    我正在使用 ReportLab 使用 Python 制作 pdf 我想向画布添加一个形状 并让该形状充当超链接 使以下示例中的矩形链接到 google com 的最简单方法是什么 from reportlab pdfgen import c
  • 处理变量的范围:内部循环

    作为一名直接进入 Go 的 JS 开发者 如果长度超过commits不止一个 我没有太多时间来完成这件事 而且我搜索的时间比我希望的要长 关于如何重组它或让它发挥作用有什么想法吗 case github PushPayload push p
  • VSCode:activeTextEditor编码

    有什么方法可以在我的扩展代码中获取当前文档编码 位于底部栏中 就像是vscode window activeTextEditor encoding 这似乎不可能 由于几乎不可能证明是否定的 因此本答案的其余部分记录了我的探索内容 字符串 e
  • PhantomJS CPU(核心)受限吗?

    我开始做一些基于并行浏览器的测试 并想看看在达到 100 CPU 之前我可以在 EC2 大型机器上并行运行多少个浏览器 我正在使用 JMeter webdriver 插件来实际运行浏览器 对于 FireFox 实际上每个 CPU 核心有 1
  • 使用 Mongodb 和 Node.js 在一个页面中处理多个表单

    我的登录和注册表单都在同一页面上 我已经指定了两种不同的路由来发布数据 但是当我点击注册表单末尾的注册按钮时 它会保存登录表单输入 没有 我看了这个问题 多种表单 一张处理页面 https stackoverflow com questio
  • 在word文档的标题中添加图片时出现问题

    我正在Word文档的标题中添加图片 它显示图像的框架并显示 当前无法显示图像 如果我将文本添加到标题 它会显示文本 如果我在文档正文中添加图像 它也会显示图像 获取图像也是如此 它在标题上显示文本 但没有图像 我的支票快用完了 有人可以建议
  • iOS - Xcode 错误:由于系统完整性保护而无法附加到进程

    当我从 XCode 运行按钮运行应用程序共享扩展 然后尝试共享文件时 XCode 经常显示以下错误 有人知道是什么原因造成的吗 错误 由于系统完整性保护 无法附加到进程 系统完整性保护 SIP 又名无根 是 OS X 10 11 中的一项新
  • 巨大下拉列表的替代方案(24,000 多个项目)

    在我的管理部分中 当我编辑项目时 我必须将每个项目附加到父项目 我有超过 24 000 个父项目的列表 这些项目按字母顺序列在下拉列表 音乐艺术家列表 中 在下拉菜单中列出所有这些项目的编辑页面有 2MB 对于使用旧机器的人来说 它的速度非
  • 由尾随空格分隔的 Cobol 字符串

    WORKING STORAGE FIRST STRING PIC X 15 VALUE SPACES SECOND STRING PIC X 15 VALUE SPACES OUTPUT STRING PIC X 31 VALUE SPAC