【发布时间】:2013-08-06 23:36:57
【问题描述】:
我是该网站和 COBOL 的新手。我正在尝试编写一个程序,该程序读取一个 80 字节的文件,并找到一个特定的字符串并抓取另一个紧随其后的字符串。我遇到的唯一问题是字符串的起始位置并不总是在整个文件中的同一字节中。例如,我试图在下面找到的字符串是在整个文件中出现两次的 LENGTH(#####) 字符串:
长度(14909135)文件ID(DD:EDIREC)MSGDATE(130723)MSGDATELONG(20130723) MSGTIME(091053) MSGSEQO(001390) MSGNAME(00008557) MSGSEQNO(00001) SESSIONKEY(XXXXXXXX) DELIMITED(E) 系统名(XXXXX-XX) 系统级(XXXX) 时区(L) DATATYPE(E) EDITYPE(XXX) SENDERFILE(#####) RECFM(??????) RECLEN(#) RECDLM(E) UNIQUEID(XXXXXXXX) SYSTYPE(##) SYSVER(#); 收到的帐户(XXXX)用户ID(XXXXXXXX)类别(#E2)费用(3)长度(14911043) 文件ID(DD:EDIREC)MSGDATE(130723)MSGDATELONG(20130723)MSGTIME(093045) MSGSEQO(001392) MSGSEQNO(00000) SESSIONKEY(XXXXXXXX) DELIMITED(C) SYSNAME(XXXXX-XX) SYSLEVEL(XXXX) TIMEZONE(L) DATATYPE(E) EDITYPE(未格式化) SENDERFILE(XXXXXXXXXXXXX) RECFM(????) RECLEN(0) RECDLM(C) UNIQUEID(XXXXXXXX) SYSTYPE(24) SYSVER(5);注意两个 LENGTH(#####) 字符串。下面的代码设法计算长度字符串出现的次数以及获取最终长度字符串计数(我真正想要的,长度字符串中的数字),但仅当它们位于这两个位置时:
工作存储部分。 01 WS-输入-记录图片 X(80)。 01 WS-字符串。 05 长度字符串 PIC X(7) 值 'LENGTH('. 01 WS-计数器。 05 WS-MSG-COUNT PIC 9(11)。 01 WS-CHAR-TOTALS。 05 CHAR-TOTAL PIC 9(11) 值为零。 05 TMP-TOTAL PIC X(11) 值为零。 …… 程序部。 2200-获取-味精-总计。 检查 WS-INPUT-RECORD 统计所有长度字符串的 WS-MSG-COUNT。 2300-CHAR-TOTAL。 如果 WS-INPUT-RECORD(1:7) = 长度字符串 将 WS-INPUT-RECORD(8:9) 移动到 TMP-TOTAL UNSTRING TMP-TOTAL 由 ')' 分隔 INTO CHAR-TOTAL 万一 如果 WS-INPUT-RECORD(61:7) = 长度字符串 将 WS-INPUT-RECORD(68:9) 移动到 TMP-TOTAL UNSTRING TMP-TOTAL 由 ')' 分隔 INTO CHAR-TOTAL 万一该代码适用于上面示例输入中显示的两个位置。但如果 LENGTH(####) 以任何其他字节位置结束,它将不起作用。除了编写 80 个 IF 语句来检查字符串文件中的每个字节之外,还有没有更简单的方法可以在长度括号内获取这些值?我检查了很多其他帖子,并考虑过使用指针或表格,但我似乎无法弄清楚。
【问题讨论】:
-
如果您使用 PERFORM 代码,我会包含 INSPECT 以便您仅在知道那里(至少)有一个时才进行搜索。如果您不想要 INSPECT,则“从后面”执行循环,从“输入长度减去 9”开始(您可能得到的最短字符串,如果您知道最小可能值,请修改)。 “终止”很容易,当你到达零时你停止。 INSPECT 将为您节省大量处理时间,但我猜您的文件并没有那么大,所以您会注意到 :-),但至少您在下次复制时获得了高效的代码...