我正在尝试学习 Cobol,因为我听说过它并认为看看会很有趣。我遇到了 MicroFocus Cobol,但我不确定这是否与这篇文章相关,而且由于我喜欢在 Visual Studio 中写作,因此有足够的动力去尝试和学习它。
我一直在阅读很多关于它的内容并尝试遵循文档和示例。到目前为止,我已经让用户输入和输出到控制台工作,所以我决定尝试文件 IO。当我一次只阅读“记录”时,一切正常,我意识到“记录”可能是不正确的行话。虽然我已经编程了一段时间,但我是 cobol 的一个极端菜鸟。
我有一个我之前编写的 c++ 程序,它只需要一个 .csv 文件并对其进行解析,然后按用户想要的任何列对数据进行排序。我认为在 cobol 中做同样的事情并不难。显然我在这方面判断错误。
我有一个文件,使用 notepad++ 在 Windows 中编辑,名为 test.csv,其中包含:
4001942600,140,4
4001942700,141,3
4001944000,142,2
此数据来自美国人口普查,其列标题标题为:GEOID、SUMLEV、STATE。我删除了标题行,因为当时我不知道如何读入它,然后再读入其他数据。随便...
在 Visual Studio 2015 中,在 Windows 7 Pro 64 位上,使用 Micro Focus 和分步调试,我可以看到包含第一行数据的记录。unstring 可以正常运行,但是下次程序“循环”时,我可以进行单步调试,并查看记录并查看它包含新数据,但是当我展开监视元素时,监视显示如下所示:
REC-COUNTER 002 PIC 9(3)
+ IN-RECORD {Length = 42} : "40019427004001942700 000 " GROUP
- GEOID {Length = 3} PIC 9(10)
GEOID(1) 4001942700 PIC 9(10)
GEOID(2) 4001942700 PIC 9(10)
GEOID(3) <Illegal data in numeric field> PIC 9(10)
- SUMLEV {Length = 3} PIC 9(3)
SUMLEV(1) <Illegal data in numeric field> PIC 9(3)
SUMLEV(2) 000 PIC 9(3)
SUMLEV(3) <Illegal data in numeric field> PIC 9(3)
- STATE {Length = 3} PIC X
STATE(1) PIC X
STATE(2) PIC X
STATE(3) PIC X
所以我不确定为什么在第二次 Unstring 操作之前我可以看到正确的数据,但是在 unstring 发生之后,不正确的数据会存储在“表”中。同样有趣的是,如果我第三次继续,正确的数据将存储在“表”中。
identification division.
program-id.endat.
environment division.
input-output section.
file-control.
select in-file assign to "C:/Users/Shittin Kitten/Google Drive/Embry-Riddle/Spring 2017/CS332/group_project/cobol1/cobol1/test.csv"
organization is line sequential.
data division.
file section.
fd in-file.
01 in-record.
05 record-table.
10 geoid occurs 3 times pic 9(10).
10 sumlev occurs 3 times pic 9(3).
10 state occurs 3 times pic X(1).
working-storage section.
01 switches.
05 eof-switch pic X value "N".
* declaring a local variable for counting
01 rec-counter pic 9(3).
* Defining constants for new line and carraige return. \n \r DNE in cobol!
78 NL value X"0A".
78 CR value X"0D".
78 TAB value X"09".
******** Start of Program ******
000-main.
open input in-file.
perform
perform 200-process-records
until eof-switch = "Y".
close in-file;
stop run.
*********** End of Program ************
******** Start of Paragraph 2 *********
200-process-records.
read in-file into in-record
at end move "Y" to eof-switch
not at end compute rec-counter = rec-counter + 1;
end-read.
Unstring in-record delimited by "," into
geoid in record-table(rec-counter),
sumlev in record-table(rec-counter),
state in record-table(rec-counter).
display "GEOID " & TAB &">> " & TAB & geoid of record-table(rec-counter).
display "SUMLEV >> " & TAB & sumlev of record-table(rec-counter).
display "STATE " & TAB &">> " & TAB & state of record-table(rec-counter) & NL.
************* End of Paragraph 2 **************
我很困惑为什么在读取操作之后我实际上可以看到数据,但它没有存储在表中。我也尝试将表格的声明更改为 pic 9(一些长度)并且结果发生了变化,但我似乎无法确定我对此没有得到什么。