Cobol について聞いたことがあり、見るのが楽しいと思ったので、Cobol を学ぼうとしています。私は MicroFocus Cobol に出くわしましたが、それがこの投稿に関連しているかどうかはよくわかりませんが、Visual Studio で書くのが好きなので、それを試して学ぶのに十分なインセンティブでした。
私はそれについて多くのことを読んでおり、ドキュメントと例に従おうとしています。これまでのところ、コンソールへのユーザー入力と出力が機能しているので、ファイル IO を試してみることにしました。一度に「レコード」を読み込んでいたときは問題ありませんでしたが、「レコード」が間違った専門用語である可能性があることに気付きました。私はしばらくの間プログラミングをしていますが、cobol の極端な初心者です。
私は以前に書いた C++ プログラムを持っています。これは単に .csv ファイルを取得して解析し、ユーザーが望む列でデータを並べ替えます。cobolで同じことをするのは難しくないと思いました。どうやら私はこの点で判断を誤ったようです。
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
そのため、2 回目の Unstring 操作の直前に適切なデータが表示される理由がわかりませんが、unstring が発生した後、誤ったデータが「テーブル」に格納されます。また興味深いのは、3 回目に続行すると、正しいデータが「テーブル」に格納されることです。
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(ある程度の長さ)にも変更しようとしましたが、結果は変わりますが、これについて何が得られていないのかを特定できないようです。