COBOL读取顺序行文件,计数字符
在COBOL中,我从顺序行文件中读取数据。一行接一行,到EOF,诸如此类COBOL读取顺序行文件,计数字符,cobol,Cobol,在COBOL中,我从顺序行文件中读取数据。一行接一行,到EOF,诸如此类 read bank-file at end move 'Y' to end-of-bank 行的长度从40到80个字符不等。我需要知道,每行有多少个字符。但行可以以空格结尾,我也需要计算。所以我不能从程序中的变量中提取字符串的长度。READ语句是否有返回值,返回从已读行返回的字符数(直到达到CRLF)?Edit 如注释中所述,实际上可以读取字符数(字节),实际上,记录根据
read bank-file at end
move 'Y' to end-of-bank
行的长度从40到80个字符不等。我需要知道,每行有多少个字符。但行可以以空格结尾,我也需要计算。所以我不能从程序中的变量中提取字符串的长度。READ语句是否有返回值,返回从已读行返回的字符数(直到达到CRLF)?Edit
如注释中所述,实际上可以读取字符数(字节),实际上,记录根据
子句的不同而变化:
环境部。
输入输出部分。
文件控制。
选择一些文件
分配给“someFile.txt”
组织是按行顺序的。
数据司。
文件部分。
FD文件
记录范围为40到80,具体取决于某一行的长度。
01一些一线图X(80)。
工作和储存科。
77一些直线长度图9(3)。
现在,对于每次读取,记录长度存储到SOME-LINE-length
:
READ SOME-FILE NEXT RECORD
DISPLAY SOME-LINE-LENGTH
我不知道到底是哪家供应商支持它(可能几乎所有),但至少它可以与ACUCOBOL一起使用
原职 据我所知,对于执行
read
语句读取的字节数没有反馈。显然,字节会立即存储到文件部分的文件描述符所描述的记录中
但是,您可以通过计算写入记录的字符数来计算读取的字节数。
首先,将文件记录初始化为低值。然后读下一条记录;这将移动读取到记录中的字节数。当读取的字节数小于记录大小时,记录末尾的字节保持不变
MOVE LOW-VALUES TO YOUR-RECORD
READ YOUR-FILE NEXT RECORD
PERFORM VARYING SOME-COUNTER FROM 72 BY -1 UNTIL (SOME-COUNTER < 0)
IF NOT (YOUR-RECORD(SOME-COUNTER : 1) = LOW-VALUES)
EXIT PERFORM
END-IF
END-PERFORM
将低值移动到您的记录
在下一个记录中读取您的文件
将某些计数器从72变为-1,直到(某些计数器<0)
如果不是(您的记录(某些计数器:1)=低值)
退出表演
端到端IF
末端执行
SOME-COUNTER
将包含行长度,假设文件中不存在NUL
值
我想当行的数量很大时,这会很耗时,但至少你得到了行的长度
如前所述,由于您没有提供更多细节,我不得不做出一些假设
我自己正在Windows 10上运行MicroFocus ACUCOBOL-GT。如果您仍然不知道有多少字节,请尝试以下操作:
unix/linux/PC上的cobol的奇妙之处在于,在大多数情况下,他们不检查文件结构,他们认为您足够聪明,可以告诉程序文件是什么,对于复杂的文件,例如嵌入在文件中的MFCobol B树索引,文件头将完成其余工作
我第一次接触MFCobol时,用户总是会收到损坏的文件,我们需要一种快速了解错误的方法,因此我利用这一事实,基本上解析文件以寻找某些功能,例如x'0A(UNIX)或CR/LF,它会告诉我们有人使用二进制传输将文件从PC FTP传输到LINUX。它完全按照我们希望的那样做了,我们最终将其作为最终用户utillity发布
基于此,您可以告诉文件它有1个字节的记录,并将每个字节作为二进制序列读取。这将允许您在字节经过时对其进行计数。将文件定义更改为二进制顺序,记录大小为picx(01)。由于您声明记录终止符为CR/LF,因此需要一个2字节的字段来进行模式识别,并减少分隔符的字节数
SELECT SOME-FILE
ASSIGN TO "someFile.txt"
ORGANIZATION IS BINARY SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD SOME-FILE
01 SOME-BYTE PIC X(01).
WORKING-STORAGE SECTION.
01 PATTERN-BUFFER.
05 PB-01 PIC X(01).
05 PB-02 PIC X(01).
01 BYTE-COUNT PIC 9(9) VALUE ZERO.
01 END-OF-SOME-FILE PIC X(01) VALUE IS "N"
PROCEDURE DIVISION.
MAIN.
open SOME-FILE.
READ SOME-FILE INTO SOME-BYTE
AT END
CLOSE SOME-FILE
DISPLAY "BYTE-COUNT: 0"
STOP RUN
NOT AT END
MOVE 1 TO BYTE-COUNT
PERFORM UNTIL END-OF-SOME-FILE="Y"
READ SOME-FILE ** (1 byte record)
AT END MOVE "Y" TO END-OF-SOME-FILE
DISPLAY BYTE-COUNT
STOP RUN
NOT AT END
ADD 1 to BYTE-COUNT
MOVE PB-02 to PB-01
MOVE SOME-BYTE TO PB-02
IF PATTERN-BUFFER = x'0D0A'
SUBTRACT 2 FROM BYTE-COUNT
ELSE
IF PB-01 = x'00" AND PB-02 < X'20' <<=== SEE NOTE
SUBTRACT 1 FROM BYTE=COUNT
END-IF
END-IF
END-READ
END-PERFORM
END-READ
选择一些文件
分配给“someFile.txt”
组织是二进制顺序的。
数据司。
文件部分。
FD文件
01多字节picx(01)。
工作和储存科。
01模式缓冲区。
05 PB-01图X(01)。
05 PB-02图X(01)。
01字节计数PIC 9(9)值为零。
01某些文件的结尾PICX(01)值为“N”
程序司。
梅因。
打开一些文件。
将某个文件读入某个字节
最后
关闭一些文件
显示“字节计数:0”
停跑
不在最后
移动1到字节计数
执行到某些文件的结尾=“Y”
读取文件**(1字节记录)
在末尾,将“Y”移动到某个文件的末尾
显示字节计数
停跑
不在最后
将1添加到字节计数
将PB-02移动到PB-01
将一些字节移动到PB-02
如果PATTERN-BUFFER=x'0D0A'
从字节计数中减去2
其他的
如果PB-01=x'00“您是否尝试过PB-02FD infle记录因infle记录长度而异。
这可能会为您的ACUCOBOL程序节省一点计算时间。注意NULL
,它与LOW-VALUE
或x“00”
不同,NULL
引用的是指针的内容,而不是零字节。@briantifin使用ACUCOBOL,将值设置为NULL
将用NUL
字节填充变量的所有字节,如果没有