Cobol 将值替换为nothing/null

Cobol 将值替换为nothing/null,cobol,Cobol,我有一个需要删除的带有分隔符(如#RT#、#LT#、#BC#等)的文本文件 例如: 原件:欠税:#RT#3000美元 固定版本:欠税:3000美元 用空格替换显然不起作用,因为它放在空格中-因为这将是一个计算机读取的文件-它需要精确-只有nothing/null可以 有什么想法吗 以上是数据的代表性样本。。。只是随机的数据段,其中有#RT#和#LT#。目前,使用的是替换为空格。但是我需要完全像上面的例子一样移除它。因为我在路上,所以明天才能发布代码。检查你的文本,用空格替换。留下空格检查您的文本

我有一个需要删除的带有分隔符(如#RT#、#LT#、#BC#等)的文本文件

例如:

原件:欠税:#RT#3000美元

固定版本:欠税:3000美元

用空格替换显然不起作用,因为它放在空格中-因为这将是一个计算机读取的文件-它需要精确-只有nothing/null可以

有什么想法吗


以上是数据的代表性样本。。。只是随机的数据段,其中有#RT#和#LT#。目前,使用的是替换为空格。但是我需要完全像上面的例子一样移除它。因为我在路上,所以明天才能发布代码。

检查你的文本,用空格替换。留下空格<代码>检查您的文本不允许用“替换(两者的长度必须相同,或者替换标识符必须是一个比喻常量:空格[S]、零[S|ES]或引号[S])-如果您尝试此操作,一个好的编译器将输出一条可理解的消息

这只剩下3个选项:

  • 不要使用COBOL(如果您不想对文本文件执行任何其他操作,这将是#1选项),而是使用系统调用,例如
    sed-e的/#RT//g'yourfile>yourtarget,具体取决于您使用的COBOL运行时(在问题中添加此信息总是一个好主意!)您可以通过COBOL启动进程,使用外部命令调用“系统”

  • 读取
    数据,使用特定于运行时的扩展将其翻译(例如,使用GnuCOBOL:
    将函数替换(yourtext,'.#RT#','','.'.#LT#'。')转换为翻译文本
    )-可能是一个
    函数
    、一个系统库
    调用
    -和
    写回数据

  • 好的旧COBOL方法-见下文

由于问题不是关于读取数据或将其写回,因此这只是替换部分:

选项a):解除语句的重读

MOVE 0 TO t1, t2, t3, t4
UNSTRING yourtext
   DELIMITED BY ALL '#RT#' OR 
                ALL '#LT#' OR
                ...
             INTO target-1 COUNT IN t1
                  target-2 COUNT IN t2
                  target-3 COUNT IN t3
                  target-4 COUNT IN t4
                  ...
END-UNSTRING
MOVE SPACES TO translated-text
STRING target-1 (1:t1)
       target-2 (1:t2)
       target-2 (1:t2)
       target-2 (1:t2)
       ...
       DELIMITED BY SIZE INTO translated-text
END-STRING
选项b)一个简单的
执行带有两个指针的变化
,与一个简单的
IF
语句相结合

*> you may get more performance if you `REDEFINE` source-text as a `PIC X OCCURS length-of-text TIMES` - but I find this one more better to read and it shouldn't consume much more time...

MOVE 0 TO target-pointer
PERFORM VARYING source-pointer
        FROM 1 BY 1
        UNTIL   source-pointer > length-of-text
   IF source-text (source-pointer:1) = '#'
      *> a very good optimizer would calculate the constant on the
      *> right side, you may write it directly
      IF source-pointer + 4 > length-of-text
         ADD  1 TO target-pointer
         MOVE source-text (source-pointer:)
           TO target-text (target-pointer:)
         EXIT PERFORM
      END-IF
      IF source-text (source-pointer:4) = '#RT#' OR '#LT#' OR ...
         ADD 4 TO source-pointer
         EXIT PERFORM CYCLE
      END-IF
   END-IF
   ADD  1 TO target-pointer
   MOVE source-text (source-pointer:1)
     TO target-text (target-pointer:1)
END-PERFORM

检查文本并用空格替换
留下空格<代码>检查您的文本不允许用“
替换(两者的长度必须相同,或者替换标识符必须是一个比喻常量:空格[S]、零[S|ES]或引号[S])-如果您尝试此操作,一个好的编译器将输出一条可理解的消息

这只剩下3个选项:

  • 不要使用COBOL(如果您不想对文本文件执行任何其他操作,这将是#1选项),而是使用系统调用,例如
    sed-e的/#RT//g'yourfile>yourtarget,具体取决于您使用的COBOL运行时(在问题中添加此信息总是一个好主意!)您可以通过COBOL启动进程,使用外部命令调用“系统”

  • 读取
    数据,使用特定于运行时的扩展将其翻译(例如,使用GnuCOBOL:
    将函数替换(yourtext,'.#RT#','','.'.#LT#'。')转换为翻译文本
    )-可能是一个
    函数
    、一个系统库
    调用
    -和
    写回数据

  • 好的旧COBOL方法-见下文

由于问题不是关于读取数据或将其写回,因此这只是替换部分:

选项a):解除语句的重读

MOVE 0 TO t1, t2, t3, t4
UNSTRING yourtext
   DELIMITED BY ALL '#RT#' OR 
                ALL '#LT#' OR
                ...
             INTO target-1 COUNT IN t1
                  target-2 COUNT IN t2
                  target-3 COUNT IN t3
                  target-4 COUNT IN t4
                  ...
END-UNSTRING
MOVE SPACES TO translated-text
STRING target-1 (1:t1)
       target-2 (1:t2)
       target-2 (1:t2)
       target-2 (1:t2)
       ...
       DELIMITED BY SIZE INTO translated-text
END-STRING
选项b)一个简单的
执行带有两个指针的变化
,与一个简单的
IF
语句相结合

*> you may get more performance if you `REDEFINE` source-text as a `PIC X OCCURS length-of-text TIMES` - but I find this one more better to read and it shouldn't consume much more time...

MOVE 0 TO target-pointer
PERFORM VARYING source-pointer
        FROM 1 BY 1
        UNTIL   source-pointer > length-of-text
   IF source-text (source-pointer:1) = '#'
      *> a very good optimizer would calculate the constant on the
      *> right side, you may write it directly
      IF source-pointer + 4 > length-of-text
         ADD  1 TO target-pointer
         MOVE source-text (source-pointer:)
           TO target-text (target-pointer:)
         EXIT PERFORM
      END-IF
      IF source-text (source-pointer:4) = '#RT#' OR '#LT#' OR ...
         ADD 4 TO source-pointer
         EXIT PERFORM CYCLE
      END-IF
   END-IF
   ADD  1 TO target-pointer
   MOVE source-text (source-pointer:1)
     TO target-text (target-pointer:1)
END-PERFORM

显示分隔数据的代表性示例、预期输出、代码的输出以及代码。就目前而言,任何人真正能说的就是“不要包含分隔符”。我也不理解你的“电脑阅读”观点,所以请澄清是否有任何真实的内容。计算机理解空间。比尔所说的,加上“null”在COBOL中并不是一个真正的概念,你需要换一种方式思考。我从未尝试过用“”替换所有的“#RT#”,但它应该可以工作。如果不是,老式的循环应该可以做到这一点(但它不太优雅,请先尝试替换)。@gazz0x2z INSPECT将只在重新放置和相同长度的项目时运行。因此,老式的循环。从所示示例中,简单的数据定义就可以做到这一点。但是,该样本与“随机段落”有何关联?#xx#事物代表什么?可能会使用虚拟/实际字段对解除拉伸,但很难精确显示所显示的内容。请显示一个有代表性的示例,说明分隔数据、预期输出、代码输出以及代码。就目前而言,任何人真正能说的就是“不要包含分隔符”。我也不理解你的“电脑阅读”观点,所以请澄清是否有任何真实的内容。计算机理解空间。比尔所说的,加上“null”在COBOL中并不是一个真正的概念,你需要换一种方式思考。我从未尝试过用“”替换所有的“#RT#”,但它应该可以工作。如果不是,老式的循环应该可以做到这一点(但它不太优雅,请先尝试替换)。@gazz0x2z INSPECT将只在重新放置和相同长度的项目时运行。因此,老式的循环。从所示示例中,简单的数据定义就可以做到这一点。但是,该样本与“随机段落”有何关联?#xx#事物代表什么?可能使用虚拟/实际场对解除拉伸,但很难精确显示所示内容。