COBOL NOTES(二)

字符处理 

一.STRING 语句 

77  A  PIC  X(3)  VALUE ‘ABC’。 

77  B  PIC  X(5)  VALUE  ALL“*”。 

PROCEDURE  DIVISON. 

   … 

     STRING  A DELIMITED BY SIZE INTO B. 

   … 

STRING语句执行后,B中内容为 

ABC** 

1.STRING语句经常把多个发送字符串连接成一个较成的字符串。 

STRING A B C DELIMITED BY SIZE INTO D. 

2.发送不仅可以是变量,也可以是常量(不得为象征常量ALL) 

   STRING PROVINCE SPACE CITY “   “ STREET DELIMITED BY SIZE INTI ADDRESS. 

  SPACE,一个空格,同时在城市与街道间插入3个空格 
 
DELIMITED 短语 

DELIMITED BY (定界)短语,除了使用保留字SIZE,表示整个发送项参加连接操作外,还可以在BY的后面使用字符值常量或字符型数据项。BY后面的字值常量或数据项内容称作定界符。在执行STRING语句时,发送项的内容以定界符为界,定界符左边的内容参加合并操作,定界符本身及其右方的内容舍去不用。如果发送项中没有与定界符相匹配的内容,整个发送项全参加合并操作。定界符可以是单字符,也可以是多字符的字符串 。 

77 A PIC X(5) VALUE “ABCDE”。 

77 B PIC X(5) VALUE “EFGHI”。 

77 C PIC X(10) VALUE ALL“*”。 

STRING A DELIMITED BY “C”,B DELIMITED BY “F“  

     INTO C。 

则执行后,以的内容为 

ABE*******。 
 
POINTER短语 

POINTER(指针)短语是针对接收项的,因为每个STRING语句只能有一个接收项,所以每个STRING语句只能有一个POINTER短语。 

POINTER短语,用于规定接收项开始接收字符的起始位置。这个位置用接收项字符位置的相对号来表示,接收项左起第1字节的相对号是1,第2字节的相对号是2,。。。。。
77 P PIC 99. 

MOVE 2 TO P. 

STRING A B DELIMITED BY “C” 

       INTO C WITH POINTER P. 

执行后,C的内容为 

*ABEFGHI** 

 P的值变为9(2+7)。 

  
 
OVERFLOW 短语 

产生溢出的情况 

1.  接收项已满,尚有未发送的字符。 

2.  接收项已满,尚有未经处理的发送项 

3.  指针短语中的指针变量值不合理,小于1或大于接收项长度。 

STRING A B BY SIZE INTO C WITH POINTER P ON OVERFLOW GOTO ERR-OVER。 
 
二.UNSTRING语句 

UNSTRING语句与STRING语句作用相反,将字符串拆成若干字符串 

规则: 

如果发送项长度小于各接收项长度之和。 

1.  某接收项未装满 

2.  某接收项刚好装满,其右方各接收项没有接收内容。 

对于1,系统将未接收项中尚未接收内容的字符位置填充空格,该接收项以右各接收项内容不变。 

对于2,凡未已旧换新内容的项均维持原内容不变 

UNSTRING A INTO B C。 
 
DELIMITED 语句 

定界符可以是单字符,也可以是多字符,但不可角STRING语句那样,采用保留字SIZE,必须是字符字值常量或字符型数据项。 

如果发送项有多个字符或字符串与定界符匹配,则第一个匹配定界符以左的全部内容,作为一个发送字符串,发送给第一接收项,第二个匹配定界符以左,第一匹配定界符以右的内容,作为又一发送字符串,发送给第二接收项。若2个匹配定界符连在一起,相应接收项则接空格或0。 

一个定界短语可有多个定界符,各定界符之间用OR连接,OR表示各定界符只要一个与发送项匹配成功,就确定发送。 

UNSTRING A DELIMITED BY “,“ OR ”。“ INTO B C。 

有时要以连续出现的同样字符作为定界符,在这种情况下,可在字符字值前冠以保留字ALL。 

  
 
COUNT 短语 

COUNT 短语是把发送字符串的长度记录在一个用户定义的数据项中 

如A内容:ABCD//E5 

B:PIC XXX 

C:PIC XXX 

D:PIC XXX 

执行 

UNSTRING A DELIMTED BY ‘/’ 

        INTO B COUNT IN COUNT-B 

             C 

             D. 

则B:ABC 

C:    (3个空格) 

D:E5 (后有一个空格) 

COUNT-B值为4。 
 
DELIMITER短语 

DELIMITER(定位符存贮)短语 

UNSTRING A DELIMITER BY “,” or “;” or ALL “/” 

          INTO B DELIMITER IN DELIM-B 

               C DELIMITER IN DELIM-C. 

当没有匹配发生时,该接收项对应的定界符存贮区被清成空格 
 
POINTER短语 

用来指示发送项的字符位置 

此短语通常 在单接收项的情况下与DELIMITER短语联合使用。 

77       DELIM  PIC X. 

77      PNTR  PIC 99. 

77 ACCEPT-AREA  PIC X(80). 

01 DATA-RECORD 

03 DATA-ITEM  PIC 9(6) 

        OCCURES 10 TIMES 

           INDEXED BY INDEX. 

PROCEDURE DIVISION. 

DISPLAY “PLEASE ENTER YOUR DATA.” 

ACCEPT ACCEPT-AREA. 

MOVE 1 TO PNTR. 

MOVE LOW-VALUE TO DELIM. 

PERFORM UNSTR-PROCESS 

               VARYING  INDEX FROM 1 BY 1 

               UNTIL DELIM=”*” 

UNSTR-PROCESS. 

   UNSTRING ACCEPT-AREA DELIMITED BY ALL SPACES or “*” 

      INTO DATA-ITEM(INDEX) 

      DELIMITER IN DELIM 

      WITH PROINTER PNTR. 
 
TALLYING 短语 

计算实际接收到了多少数据 

MOVE ZERO TO TLY. 

UNSTRIGN A DELIMITED BY ALL SPACE or “*” 

   INTO B C D E F 

   TRLLYING IN TLY. 

假如A只发送了三个字符串,则TLY=3 

本短语应在POINTER语句之后,而这2个短语又必须在DELIMITER和COUNT之后 
 
OVERFLOW短语 

溢出情况 

1.  指针数值项值不合理,小于1或大于发送项长度。若不合理,不执行UNSTRING语句,控制转向溢出短语规定的命令语句 

2.  当所有接收项已装满,但发送项尚有未和定界符茶杯的数据,或者尚有未被包含在发送字符串中的数据。此时先执行UNSTRING语句,而后控制转向溢出短语规定的命令语句 
 
三.INSPECT语句 

  

1>  INSPECT/TALLYING语句  

INSPECT A TALLYING TLY FOR ALL “A” 

对指定字符串的所有出现进行计数,即数据项中每出现一个指定的字符串,计数器就加1 

INSPECT A TALLYING TLY FOR LEADING “*” 

对指定字符串作为前缀进行计数,计算数据项中从第一个字符开始连续出现多少指定的字符串。 

INSPECT A TALLYING FLY FOR CHARACTERS 

对所有出现的字符进行计数 

INSPECT A TALLYING T1 FOR “.” AFTER “A” 

                   T2 FOR “;” BEFORE “B” 
 
2>INSPECT/REPLACING语句 

INSPECT  A REPLACING CHARACTERS BY SPACE BEFORE “*”. 

用空格替代*前的全部字符 

INSPECT A REPLACING ALL “AB” BY “XY” 

                    ALL “CD” BY  “AB” 

用XY替代AB,AB替代CD 

INSPECT A REPLACING LEADING SPACE BY ZERO BEFORE “**” 

用0替代**之前的前缀为空格的前缀 

如:A为_ _ 2_ 3**,替代后A为002_3** 

    A为1_2_3_**,替代后A不变 

INSPECT A REPLACING FIRST “+” BY “-“ AFTER SPACE 

用-替代空格后第一次出现+的 
 
3>INSPECT/TALLYING/REPLACING语句 

MOVE ZERO TO TLY. 

INSPECT A TALLYING TLY FOR ALL “L” 

     REPLACING LEADING “A” BY “E” AFTER “L”.
 



文章来自: 本站原创
引用通告地址: http://www.pjhome.net/trackback.asp?tbID=150
Tags: {216}{223}
评论: 1 | 引用: -2 | 查看次数: 2613
  • 1
过客 [2008-01-28 01:08 PM]
从你这里学到了好东西,不好意思不顶一下,谢谢!!
  • 1
发表评论
昵 称:
密 码: 游客发言不需要密码.
验证码:
内 容:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 500 字 | UBB代码 开启 | [img]标签 关闭