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