プロが教えるわが家の防犯対策術!

COBOL85でCSVファイル使用して、プログラムを組みたいのですが、SELECT句、FD句等のコーディングの仕方がわかりません。有識者の方、ご教示の程、宜しく、お願い致します。

★開発条件
 ・UNIX(HP-UX)環境
 ・日立COBOL85
 ・入力ファイル、出力ファイルともCSVファイル
 ・入力ファイル、出力ファイルともASSIGN句の定義は一回ず
  つとし、レコード長が違う入力ファイル、出力ファイルの場合で
  も取扱可能とし、その場合でもプログラムの修正は行わないよう
  にし、汎用性を持たせる。

A 回答 (2件)

FD CSV-F


RECORDING V.
01 CSV-REC.
03 REC-1.
05 CSV-LENGTH PIC 9(nn) COMP-3. <----???マニュアルで確認して下さい。
05 CSV PIC X(最大長).
03 REC-2 REDEFINES REC-1.
05 FILER X(nn). <---CSV-LENGTHのバイト数
05 CSV-BYTE PIC X(1) OCCURS 最大長.

READ CSV-Fの後でCSV-LENGTHを参照すると現在の行の文字数が入っています。
後は、CSV-BYTEの中を1バイトずつ検査しながら、CSV-LENGTHになるまで処理をする。
    • good
    • 1

 まず基本の処理で、以下のような売上伝票ファイル"uriage.csv"を読み取るとすると、



(HIDUKE)(KODO)(SURYO)(TANKA)
20100401,0100,002,030
20100408,0111,005,200
20100412,0140,001,890

原始プログラム抜粋

FILE-CONTROL.
SELECT URIAGE-F ASSIGN TO "uriage.csv"
ORGANIZATION IS LINE SEQUENTIAL.
* データ部
DATA DIVISION.
FILE SECTION.
FD URIAGE-F.
01 URIAGE-R.
02 HIDUKE PIC X(8).
02 PIC X(1).
02 KODO PIC 9(4).
02 PIC X(1).
02 SURYO PIC 9(3).
02 PIC X(1).
02 TANKA PIC 9(3).

として、取り扱います。LINE SEQUENTIAL を指定することで、テキストデータ末の改行までを1レコード分と見なします。

 しかし、お望みのファイル処理は、フィールド数が不明かつフィールド長とデータ型(文字列か数値か)が不定のデータを扱いたいのでしょうから、

以下のようなコーディングを完成させる必要があるでしょう。

汎用CSVファイル抽出処理原始プログラム抜粋

FILE-CONTROL.
SELECT URIAGE-F ASSIGN TO "****.csv"
ORGANIZATION IS LINE SEQUENTIAL.
* データ部
DATA DIVISION.
FILE SECTION.
FD CSV-F.
01 CSV-R PIC X(80).
01 CSV-MASU REDEFINES CSV-R.
02 HITOMASU PIC 9(1) OCCURS 80.

* 汎用テーブル (1フィールド50文字分の50フィールドを100レコード分納められるテーブル)
WORKING-STORAGE SECTION.
01 汎用テーブル行 OCCURS 100.
02 汎用テーブル列 OCCURS 50.
02 汎用列文字 PIC X(50).
02 汎用列数値 PIC 9(50) REDEFINES 汎用列文字.

* 処理部においてレコード読込を繰り返し、その中でコンマごとの文字列を取り扱う。

PERFORM VARYING I FROM 開始桁 BY 1 UNTIL HITOMASU(I) = "," OR I = レコード文字数
 (コンマに突き当たるか、行末になるまでの文字列の固まりを作業文字列に入れる。)
END-PERFORM

(でき上がった文字列を文字扱いか、数値扱いか判断させて、指定したフィールドに納める)
 指定するフィールドの添字を1つ増やす。

 といったようなことを繰り返して、プログラム上に自分なりのワークシートのようなテーブルを作り上げて処理することになるでしょう。

 COBOL言語の特徴は、2進化10進数の1桁を並べて文字列化して処理する点なので、可変長データを扱うには自分で副プログラムを用意して、レコードの文字列を分解する必要があります。したがって、不定長のデータを扱うのは不向きと思われます。CSVデータを一度表計算ソフトに読み取り、各セルの書式を固定長のものにして保存したものを取り扱う手順をとるのが効率がよいでしょう。UNIX上の処理とのことですから、オープンオフィスでこの固定長化ができるか確かめたらよろしいでしょう。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています