
COBOL85でCSVファイル使用して、プログラムを組みたいのですが、SELECT句、FD句等のコーディングの仕方がわかりません。有識者の方、ご教示の程、宜しく、お願い致します。
★開発条件
・UNIX(HP-UX)環境
・日立COBOL85
・入力ファイル、出力ファイルともCSVファイル
・入力ファイル、出力ファイルともASSIGN句の定義は一回ず
つとし、レコード長が違う入力ファイル、出力ファイルの場合で
も取扱可能とし、その場合でもプログラムの修正は行わないよう
にし、汎用性を持たせる。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.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になるまで処理をする。
No.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上の処理とのことですから、オープンオフィスでこの固定長化ができるか確かめたらよろしいでしょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
csvファイル 項目数取得
-
カンマ区切りのCSVファイルから...
-
マクロから出力されるcsvのダブ...
-
ADODBでSQL実行前にレコードセ...
-
VBSでソート&ファイル分割
-
【C#】パス名で無効な文字
-
CSVファイルの項目行を削除...
-
CSV形式での保存時に”文字列...
-
CSV形式のファイルを読み込んで...
-
csvファイルでの日付設定「yyyy...
-
VBAでCSVファイルのインポート...
-
特定文字を入ってるCSVの特定の...
-
エクセルのプロパティーでセキ...
-
エクセルvbaでdocuworksprinter...
-
エクセルのハイパーリンクがコ...
-
ExcelブックをGoogleスプレッド...
-
動かなくなってしまった古いVBA...
-
エクセルVBAで一つ上の階層...
-
xcopyコマンドの進行状況を表示...
-
ファイルのアクセス回数について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カンマ区切りのCSVファイルから...
-
マクロから出力されるcsvのダブ...
-
バッチでCSVを処理する時、空の...
-
CSV出力して、MS/EXCELで開くと...
-
csvファイルでの日付設定「yyyy...
-
CSV形式での保存時に”文字列...
-
【C#】パス名で無効な文字
-
エクセルVBA 大容量CSVファイル...
-
【エクセルVBA】お願いします。...
-
データ解析ソフトRでのファイル...
-
エクセル形式のファイルの読み込み
-
【エクセル マクロ】読み込ん...
-
CSVファイルの項目行を削除...
-
csvファイル 項目数取得
-
VBAでcsvファイルを読み込んで...
-
特定ファイルの一括削除
-
VBAでCSVファイルのインポート...
-
VBAでの下記のプログラムについ...
-
VBA 毎日取得するデータを反映...
-
csvファイルを列数ごとに分割す...
おすすめ情報