Cobol 检查或搜索字段-a以查找字段-b的内容

Cobol 检查或搜索字段-a以查找字段-b的内容,cobol,Cobol,及 左对齐和大写字段-b-length是其最后一个非空字节的位置 我需要匹配查看field-b(长度为field-b-length)是否出现在field-a的任何地方,即如果field-b='DOG'和field-a='许多人喜欢狗,但有些人更喜欢猫(后面是空格,长度为100),则匹配它们 我查看了INSPECT语句,但它匹配的是文本值,而不是变量名。就像我可以为所有“狗”做一个Inspect field-a理货cnt-1,但不能为所有field-b(1:field-b-length)做Insp

左对齐和大写
字段-b-length
是其最后一个非空字节的位置

我需要匹配查看
field-b
(长度为
field-b-length
)是否出现在
field-a
的任何地方,即如果
field-b='DOG'
field-a='许多人喜欢狗,但有些人更喜欢猫(后面是空格,长度为100)
,则匹配它们

我查看了
INSPECT
语句,但它匹配的是文本值,而不是变量名。就像我可以为所有“狗”做一个
Inspect field-a理货cnt-1
,但不能为所有field-b(1:field-b-length)做
Inspect field-a理货cnt-1
,在本例中为“狗”

Field-a
在一个有2000万条记录的文件中,而
Field-b
在一个有400条记录的文件中,因此作业要运行10个多小时,我必须运行25个以上的作业,因此我必须对照
Field-b
文件中的每个条目检查
Field-a
(读取到程序中的数组中)

目前,我正在确定
field-b
的长度,并通过
field-b
的长度将其与
field-a
进行字节比较。如果有任何字节不匹配,我退出,将
字段a
移到左边,然后重试,直到我尝试了
(100-field-b-length)
次。虽然很难看,但它很管用


我在寻找更高效、更优雅的东西

我觉得你应该使用数据库。将两个文件加载到表中,然后执行
SELECT操作,这样做是值得的。。。其中
类似
子句。我希望整个过程在几分钟内完成。

我觉得你应该使用数据库。将两个文件加载到表中,然后执行
SELECT操作,这样做是值得的。。。其中
类似
子句。我希望整个过程在几分钟内运行。

哪个COBOL不将标识符-3作为计数标准

这应该行得通

pic x(100) field-b

给予

   inspect field-a tallying
       found-count for all field-b(1:comparison-length)
   if found-count greater than zero then
       display "Found " found-count " occurrences" end-display
   else
       display
          "No " field-b(1:comparison-length) " found"
       end-display
   end-if

   move "HORSE" to field-b
   move zero to comparison-length
   inspect field-b tallying comparison-length
       for characters before initial space

   inspect field-a tallying position-tally
       for characters before initial field-b(1:comparison-length)
   if position-tally less than length of field-a then
       display "Found at " position-tally end-display
   else
       display
           "No " field-b(1:comparison-length) " found"
      end-display
   end-if
但是,这是用GnuCOBOL测试的,所以我对您的特定编译器很好奇


编辑;由于Bill Woodger的评论,代码发生了一些变化。左图是两种类型的子字符串检测,仅仅因为

哪个COBOL不将标识符-3作为计数标准

这应该行得通

pic x(100) field-b

给予

   inspect field-a tallying
       found-count for all field-b(1:comparison-length)
   if found-count greater than zero then
       display "Found " found-count " occurrences" end-display
   else
       display
          "No " field-b(1:comparison-length) " found"
       end-display
   end-if

   move "HORSE" to field-b
   move zero to comparison-length
   inspect field-b tallying comparison-length
       for characters before initial space

   inspect field-a tallying position-tally
       for characters before initial field-b(1:comparison-length)
   if position-tally less than length of field-a then
       display "Found at " position-tally end-display
   else
       display
           "No " field-b(1:comparison-length) " found"
      end-display
   end-if
但是,这是用GnuCOBOL测试的,所以我对您的特定编译器很好奇


编辑;由于Bill Woodger的评论,代码发生了一些变化。留下两种类型的子字符串检测,只是因为首先,您的数据名不会编译,至少按照标准。忽略忽略级别编号,字段名称(如果存在)必须紧跟级别编号。然后,数据定义的子句可以是您喜欢的任何顺序

其次,“丑陋但有效”不起作用,你只是没有测试极限。将狗放在位置98、99和100,然后尝试(100-3)从位置1找到狗。第一次尝试将从位置1开始,第97次尝试将从位置97开始。第98个字节永远不会用作起点,因此尾随的狗永远不会匹配。一个接一个。被青蛙带走了。被狗带走了

正如Brian Tanner所说,
INSPECT
做你想做的事。INSPECT的优点是,对于三字节引用修改,您的数据可以从位置98开始,并且仍然可以获得匹配。检查已为您编码

既然您没有说您需要所有狗的计数,只需知道它在那里,然后首先使用
,而不是
all
。当发现匹配项时,检查将“停止”。这只会影响“匹配”的性能,但仍然不需要为此做额外的工作

检查是否是最快的方法取决于实际使用的编译器中的实现。因此,如果您迫切需要速度(每天需要完成五次任务),请测试它,看看它如何满足您的性能要求

如果你需要寻找更快的速度,你需要很好地了解数据

在IBM的Enterprise COBOL中,INSPECT with Talling、ALL(不能像我最初建议的那样首先使用,只能在INSPECT上替换)和reference modified字段是执行此操作的最快通用方法,并且只有当您需要比其他地方更高的性能时

有许多“搜索”任务可以考虑进行检查,通常是:是否存在(您的任务);有多少人;它在哪里

对于前两种情况,通过理货和其他方式进行检查。虽然如果只需要知道它们是否存在,那么将它们全部计算出来似乎是愚蠢的,但这个版本的INSPECT是最快的方法。如果它数到一,然后继续打猎到最后,它只会在有匹配的记录上这样做。INSPECT的另一种用法是“非常慢”(一个相对术语),用于计算…之前的所有字符

为了以最有效的方式确定起始位置,首先检查是否有需要查找的内容。然后,使用循环查找数据(您将知道数据在那里,所以不需要检查字段的“过度运行”)

对于特定的编译器,这些对INSPECT性能的引用可能不正确,因为它完全取决于实现

与往常一样,对于性能问题,数据的实际性质将帮助您选择最佳方式。上述建议(给定编译器)适用于“外观正常”的数据。如果你的数据不是特别“正常”,那么专注于数据中不正常的部分会有所帮助

假设2000万条记录中有90%的数据需要搜索,即30字节或更少

Found 002 occurrences
No HORSE found
01  field-to-search.
    05  mostly-data-here                PIC X(30).
    05  sometimes-data-here             PIC X(70).
        88  only-the-short-data         VALUE SPACE.

IF only-the-short-data
    INSPECT mostly-data-here ...
ELSE
    INSPECT field-to-search ...
END-IF