COBOLで入力レコードフォーマットが可変の場合の対応方法

このQ&Aのポイント
  • COBOLのプログラミングで、入力レコードのフォーマットが可変の場合、どのように定義すれば必要な項目を得られるかを解説します。
  • 具体的な例を挙げながら、可変なレコードフォーマットの場合の対応方法を説明します。
  • 入力レコードのフォーマットが決まっていない場合の対応策についても考えてみます。
回答を見る
  • ベストアンサー

COBOLで入力レコードフォーマットが可変の場合

COBOLのプログラミングの質問です。 基本的な質問かもしれませんが。。。 入力となるレコードのフォーマットが可変である場合、 DATA DIVISIONをどのように定義をすれば必要な項目を得られるでしょうか? たとえば以下の場合です。  入力レコード:1024バイト  レコード内容:開始4バイトは固定。          以降は、A(10バイト)、B(20バイト)、C(30バイト)のいずれかのパターンが来る。          ※AからCの先頭1バイトのフラグでA,B,Cのどれかがわかる          Aのフォーマット            1バイト目:フラグ、2~4バイト目:レコード長、5~10バイト目:会社名          Bのフォーマット            1バイト目:フラグ、2~4バイト目:レコード長、5~10バイト目:会社名、            11~20バイト目:会社の従業員数          Cのフォーマット            1バイト目:フラグ、2~4バイト目:レコード長、5~10バイト目:会社名、            11~20バイト目:会社の従業員数、21~30バイト目:会社の売上金額      [レコードの例]      1レコード目:固定部,C,B,A,B,B・・・B,B      2レコード目:固定部,A,C,C,A,B・・・B,C      上記のレコードから、会社名や会社の売上金額を取り出すようにしたいです。  入力レコードのフォーマットが決まっていれば、その項目にそって定義すればよいと思いますが  決まっていない場合の方法がわかりません。  また、読み込んでから判断する必要があるため、どうしてよいかわかりません。  質問内容がわかりにくくてすみませんが、わかる方がいましたらよろしくおねがいします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#193571
noname#193571
回答No.1

いろんなやり方があると思います。 一例として。 DATA DIVISIONでは、1024バイトの1項目だけ記述。 WORKING-STORAGE SECTIONに、1024バイトの項目と、A,B,Cそれぞれのフォーマットの項目を定義。入力ファイルをREAD INTO文か、READした後のMOVEで、1024バイトの項目に転送。 フラグを判定しながら、A,B,Cのフォーマットの項目にその部分だけ転送して処理することを繰り返す。 フラグの判定とA,B,Cのフォーマットへの転送は部分参照を使います。

nodonodowan
質問者

お礼

素早い回答ありがとうございました。 なるほど、部分参照というのがあるのですね! 各フォーマット毎に必要な分だけ転送できるので便利ですね。 これでできそうです。

その他の回答 (1)

  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.2

REDEFINE で同じ領域に3種類のレコードを定義します。 フラグを見てどれかのレコードを使って処理。

nodonodowan
質問者

補足

ありがとうございます。 当初REDEFINEで定義することも考えたのですが、 レコードの内容が不明の場合にどのように定義するのかがわかりませんでした。。。 WORKING STORAGE SECTION に1レコード分の定義と3種類の定義をする場合、 どのようにREDIFINEを定義するのでしょうか?

関連するQ&A

  • 1レコードからなるファイルを複数レコードに分割

    可変長の1レコードのみのファイル(固定長のレコードが改行コードなくつながっている)をもとにして、固定長のcsvファイルを作成する方法をお教えください。 具体的には、 項目A(10バイト)、項目B(5バイト)、項目C(20バイト)からなる35バイトのデータが改行コードなくつながっている50000バイトくらいの1レコードを入力して、項目A,B,Cから1レコードが構成されるcsvファイルを作成したいと思います。 よろしくお願いします。

  • COBOLについて

    COBOLで以下のような仕様の場合、どのようなロジックにするのが良いでしょうか? ・仕様  A項目=値A または  B項目=値B または  (C項目=値C かつ D項目=値D ) または  E項目=値E 上記の場合、何も処理しない(以降の処理もせずに、次レコードを読みに行く  上記以外の場合、処理1を行い、次処理以降の処理を継続する。 (ロジック1) IF A項目=値A OR B項目=値B OR (C項目=値C かつ D項目=値D ) OR E項目=値E THEN CONTINUE ELSE 処理1を行う END-IF. (ロジック2) IF A項目=値A MOVE '1' TO 該当フラグ END-IF. IF B項目=値B MOVE '1' TO 該当フラグ END-IF. IF (C項目=値C かつ D項目=値D ) MOVE '1' TO 該当フラグ END-IF. IF E項目=値E MOVE '1' TO 該当フラグ END-IF. IF 該当フラグ='1' CONTINUE ELSE 処理1 END-IF. 自分は仕様に沿ってロジック1で組むべきだと思うのですが、 ロジック1は分かりずらいのとメンテが大変なのでロジック2で組むべきだと言われました。 どちらで組むのが普通でしょうか?どなたか教えて下さい!

  • COBOLでの可変長定義について

    unix環境下でCOBOL85を使用しています。 あるデータを可変長でWRITEしていくのですが、 データにヘッダー情報みたいなものが付加されてしまい困っています。 ヘッダー情報を付加しないようにするにはどうすればいいのでしょうか? 定義:  FD Aファイル RECORD IS VARYING 1 TO 100 DEPENDING ON A-CNT.  01 A-DATA PIC X(100). とか  FD Aファイル RECORD IS VARYING IN SIZE DEPENDING ON A-CNT.  01 A-DATA PIC X(100). というパターンで試しています。 Aファイルにaaaという3バイトデータをWRITEすると、 COBOL85020315020304・・・・・aaaというデータが出力されます。 あるコボラーに聞くと「定義がおかしいからでしょう」と言ってたのですが、 どうおかしいかは本人もわからないようです。 どうすればヘッダー情報(COBOL85020315020304・・・・・)がつかず、 可変長でWRITEできるのでしょうか?教えて下さい。

  • 固定長レコードの取り扱い

    ファイルから固定長のレコードを読み込んで、そのレコードから、ある項目をとりだしたいのですが・・・ レコードのフォーマット   名前 : Ch (8byte)   金額1: Int(4byte)   金額2: Int(4byte)   金額3: Int(4byte) ここから、金額2を取り出すには、どうしたら?・・・ $kingaku2 = substr($rec, 12, 4); と、やると、うまくいかない($kingaku2 の Length が 0 になってしまうような・・・)のですが・・・

    • ベストアンサー
    • Perl
  • コボル!!!!!

    今コボルを習い始めています! 分からないことがあったので教えてください! IF (フラグ-終了-A   =   "END") AND  (フラグ-終了-B   =   "END") MOVE "END" TO フラグ-終了 END IF. とはどう言う意味ですか? 後、 COMPUTE    A  =  B  -  C どの様な動きをしているのか教えてください、よろしくお願いします。

  • エクセルでフラグがたっている場合、そのレコードを抽出して別シートに表を作りたい

    タイトルのとおりです A1 住所 A2 氏 A3 名 A4からA10 フラグ A11からA15 データ 以上の場合、A4からA10まではフラグで、 そのうち、ひとつのセルでも何か入力されておれば(つまり、フラグがたっている状態)そのレコード、 つまり、A1からA15までを別のシートに抽出して、フラグのたっているデータの表を新たに作成したいのです。 この場合の、関数など、作成方法などを教えてください。 よろしくお願いいたします。

  • 前レコードを参照するには

    お世話になります。 早急に教えていただきたいのですが例えば下記のようなレコードの場合ですが     A     B     C      D     E 1  No.    履歴  最新フラグ  商品   コード 2 1001    1     0     りんご    99    3 1001    2     0     りんご    99 4 1001    3     1     りんご    99 コードに99が入っているもので最新フラグがたっているレコードの前の履歴のレコードを別シートに表示させていきたいのですがどのように関数を組めばよいのかわかりません。 ご教授くださいますようお願いします。

  • 重複レコードにチェックを入れる方法

    数多くのデーターの中から、以下のように同系統のデータが有る場合に、ABC列に○×をつけたいのてすが、どのようにしたらいいのでしょうか。 1.「会社名」「種類」「費用」が同じで、「地点1」「地点2」が入れ替わっているレコードの重複と考え、重複する後のレコードのA列に×を入れる。 A    B     C    会社名    種類    地点1    地点2    費用                △△社    001     福岡     東京     ¥50,000                △△社    001     東京     福岡     ¥50,000 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ A    B     C    会社名    種類    地点1    地点2    費用                △△社    001     福岡     東京     ¥50,000 ×              △△社    001     福岡     東京     ¥50,000 2.「会社名」「種類」「地点1」「地点2」「費用」が同じの重複レコードを、後のレコードのB列に×を入れる。 A    B     C    会社名    種類    地点1    地点2    費用                △△社    001     福岡     東京     ¥50,000                △△社    001     福岡     東京     ¥50,000 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ A    B     C    会社名    種類    地点1    地点2    費用                △△社    001     福岡     東京     ¥50,000      ×         △△社    001     福岡     東京     ¥50,000 3.「会社名」「種類」「地点1」「地点2」が同じで、「費用」が異なるレコードには、両方のレコードのC列に○を入れる。 A    B     C    会社名    種類    地点1    地点2    費用                △△社    001     福岡     東京     ¥60,000                △△社    001     福岡     東京     ¥70,000 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ A    B     C    会社名    種類    地点1    地点2    費用           ○    △△社    001     福岡     東京     ¥60,000           ○    △△社    001     福岡     東京     ¥70,000 4.「会社名」「種類」が同じで、「地点1」「地点2」が入れ替わっていて、「費用」が異なるレコードには、「地点1」「地点2」の入れ替わりを同一にし、両方のレコードのC列に○を入れる。 A    B     C    会社名    種類    地点1    地点2    費用                △△社    001     福岡     東京     ¥60,000                △△社    001     東京     福岡     ¥70,000 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ A    B     C    会社名    種類    地点1    地点2    費用           ○    △△社    001     福岡     東京     ¥60,000           ○    △△社    001     福岡     東京     ¥70,000 どなたか教えていただけないでしょうか。

  • SQL文おしえてください

    例えば、以下のような 2 つのテーブルがあるとします。 営業所テーブル (会社名) (担当者名)           会社A 担当者A          会社A 担当者B          会社B 担当者C          会社C 担当者D 商品売上テーブル (担当者) (売上)           担当者A  10万           担当者C   5万           担当者D  10万 これを以下のように会社名Aの会社だけを条件に「担当者B」の売上レコードがない場合でも、ゼロ件としてレコードを取得したいんですがどのようにすればよいのでしょうか。   (会社名)(担当者) (売上)    会社A  担当者A  10万    会社A  担当者B   0万 よろしくお願いします。

  • エクセルで項目名をコピーする方法

    項目名  フラグA フラグB  判定用A 判定用B 国語   1 数学   1 理科         1 社会         1 英語         1 現在A列に項目名、B列にフラグA、C列にフラグB、D列に判定用A、E列に判定用Bという表があります。 ABC列の項目名~フラグBまでは既に値が入っている状態です。 フラグA、Bには整数値が入っているか、空白の状態です。 この状態でフラグAに値が入っていれば、判定用Aに項目名を。フラグBに値があれば判定用Bに項目名をコピーしたいのですが、自動化できるでしょうか? ちなみに項目数は大体数百個単位であり、フラグAとフラグBの両方に値が入る事はありません。

専門家に質問してみよう