将值替换为空/空

Ard*_*dia 1 cobol

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

例如:-

原件:欠税:#RT#$3000

固定版本:所欠税款:$3000

用 SPACES 替换显然不起作用,因为它会放入空格 - 因为这将是计算机读取文件 - 它需要准确 - 只有无/空会起作用。

有任何想法吗?

以上是数据的代表性样本...只是其中包含#RT# 和#LT# 的随机数据段落。目前,使用的是 REPLACING with SPACES。但我需要像上面的例子一样将其完全删除。由于我在路上,所以明天才能发布代码。

Sim*_*sch 5

留下INSPECT yourtext REPLACING BY SPACES空间。INSPECT yourtext REPLACING BY ""是不允许的(两者需要具有相同的长度,或者替换标识符是一个象征性常量:SPACE[S]、ZERO[S|ES] 或 QUOTE[S]) - 如果您尝试,一个好的编译器将输出一条可以理解的消息这。

只剩下3个选择:

  • 不要使用 COBOL(如果您不想对文本文件执行任何其他操作,这将是#1 选项),而是使用系统调用,例如sed -e 's/#RT#//g' yourfile > yourtarget,取决于您使用的 COBOL 运行时(始终是一个好主意在问题中添加此信息!)您可以通过 COBOL 启动该过程CALL "SYSTEM" USING external-command

  • READ数据,使用特定于您的运行时的扩展来转换它(例如使用 GnuCOBOL: MOVE FUNCTION SUBSTITUTE (yourtext, '#RT#', '', '#LT#'. '') TO translated-text) - 可能是FUNCTION一个系统库CALL- 并将WRITE数据返回。

  • 古老的 COBOL 方式 - 见下文。

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

选项 a):UNSTRING 语句

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
Run Code Online (Sandbox Code Playgroud)

选项b) 一个简单的PERFORM VARYING带有两个指针的,结合一个简单的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
Run Code Online (Sandbox Code Playgroud)