• 締切済み

COBOL85でのCSVファイルの取扱方法について

COBOL85でCSVファイル使用して、プログラムを組みたいのですが、SELECT句、FD句等のコーディングの仕方がわかりません。有識者の方、ご教示の程、宜しく、お願い致します。 ★開発条件  ・UNIX(HP-UX)環境  ・日立COBOL85  ・入力ファイル、出力ファイルともCSVファイル  ・入力ファイル、出力ファイルともASSIGN句の定義は一回ず   つとし、レコード長が違う入力ファイル、出力ファイルの場合で   も取扱可能とし、その場合でもプログラムの修正は行わないよう   にし、汎用性を持たせる。

みんなの回答

回答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になるまで処理をする。

全文を見る
すると、全ての回答が全文表示されます。
  • seastar3
  • ベストアンサー率69% (99/142)
回答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

  • COBOL、項目末尾に空白がある場合削除の方法その他

    汎用でCOBOL85で開発しています。 入力Fは固定長、 出力Fは可変長のCSV形式ファイルです。 質問なのは、 値と値の間にカンマを入れる(値がなくても必ず固定数入れる)にはどうすればいいか。 項目の末尾に半角空白が入っていた場合削除するにはどうすればよいか。 項目ごとにMOVE文を書くのではなく、LOOPさせるようにする(項目が多いので) の書き方です。 半角空白は確か、項目の後ろから1バイトずつ数えて値があった時点で編集するというような プログラムを見た記憶があるのですが、詳しい書き方がわかりません。 どなたか少しでもお分かりになりましたら教えてもらえないでしょうか。

  • EXCELからCSVファイルの出力方法について

    EXCELについて質問です。 エクセルのシートに入力した内容をCSVファイルで出力したいです。 当方の希望としまして、いくつかあるシートの中で、希望のシートだけCSVファイルを出力し、出力する際は「CSVファイルを出力」のようなボタンをクリックすれば、CSVファイルが出力されるものです。 初心者ですので、できるだけ詳しく教えて頂きたいです。

  • 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できるのでしょうか?教えて下さい。

  • CSVファイルの出力

    こんにちは。 ただいまアクセスで商品の検索プログラムを作っていまして、入力した商品名に一致する商品コードと商品名をテーブルから抽出し、CSVファイルに出力したいのですが、どういった方法で出力すればいいのでしょうか?

  • csvファイルでの出力について

    C言語初心者です。 プログラミングにおいて質問なのですが、csvファイルを読み込み、 そのデータを用いて計算し、csvファイルで出力するという問題なのですが、C言語においてcsvファイル形式で出力するにはどのような方法がありますか? 補足:ラベル行に全角文字を入力しないといけません。

  • エクセルのCSVファイルについて。

    こんにちは。 エクセルのCSVファイルの扱いで質問です。 数値を入力した際、 通常の.xlsファイルだと、セルから大きくはみ出した数字は、セルの幅を調節すれば、入力した通りに出力されますよね? 現在、CSVファイルを扱っているのですが、 入力値が「44444444444444400000」のように大きくはみ出した場合、 セルの中には「4.44444E+19」と出力されてしまいます。 あらかじめセルの幅を広くしても、結局、桁の多い数値を入力すると同じような結果になります。 どうすれば、入力した通りの数値を出力させることができるのでしょうか? よろしくお願い致します。

  • cobolプログラムをCSV出力しても空白に...

    2度目の質問です。 宜しくお願いします。 COBOLを勉強し始めて間もないのですが、プログラムを何とか参考書を見ながら書いており、 エラーが出なくなったのですが、CSVファイルで出力しても空白になってしまい、原因がわからず困惑しております。 以下、プログラムを記載します。 何が原因がわかる方おりましたらアドバイスをいただけると幸いです。 IDENTIFICATION DIVISION. PROGRAM-ID. REI-01. ENVIRONMENT DIVISION. CONFIGURATION SECTION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT INFILE ASSIGN TO "C:\COBOL\kamokuUT2.txt" ORGANIZATION LINE SEQUENTIAL. SELECT OUTFILE ASSIGN TO "C:\COBOL\UT2.csv" ORGANIZATION LINE SEQUENTIAL. DATA DIVISION. FILE SECTION. FD INFILE. 01 INREC. 02 I-NUMBER PIC 9(2). 02 I-NAME PIC X(20). 02 I-KAMOKU-SYURUI PIC 9(3). 02 I-KAMOKU-TEN PIC X(3). FD OUTFILE. 01 OUTREC PIC X(32). 01 W-MIDASHI. 02 W-ID PIC X(8) VALUE "社員番号". 02 W-COMMA PIC X(1) VALUE ",". 02 W-NAME PIC X(4) VALUE "名前". 02 W-COMMA PIC X(1) VALUE ",". 02 W-KAMOKU PIC X(4) VALUE "科目". 02 W-COMMA PIC X(1) VALUE ",". 02 W-TEN PIC X(4) VALUE "点数". 02 W-COMMA PIC X(1) VALUE ",". 01 W-MEISAI. 02 O-NUMBER PIC 9(2). 02 O-COMMA PIC X(1) VALUE ",". 02 O-NAME PIC X(20). 02 O-COMMA PIC X(1) VALUE ",". 02 O-KAMOKU-SYURUI PIC 9(3). 02 O-COMMA PIC X(1) VALUE ",". 02 O-KAMOKU-TEN PIC X(3). 02 O-COMMA PIC X(1) VALUE ",". WORKING-STORAGE SECTION. 77 W-FLAG PIC X(1). PROCEDURE DIVISION. PERFORM MAE-SHORI THRU MAE-SHORI-EXIT PERFORM SHU-SHORI THRU SHU-SHORI-EXIT UNTIL W-FLAG = "1" PERFORM ATO-SHORI THRU ATO-SHORI-EXIT STOP RUN. MAE-SHORI. OPEN INPUT INFILE OUTPUT OUTFILE MOVE "0" TO W-FLAG READ INFILE AT END MOVE "1" TO W-FLAG END-READ. MAE-SHORI-EXIT. EXIT. SHU-SHORI. WRITE OUTREC FROM W-MIDASHI. IF I-KAMOKU-TEN >= 70 THEN MOVE I-NUMBER TO O-NUMBER MOVE I-NAME TO O-NAME MOVE I-KAMOKU-SYURUI TO O-KAMOKU-SYURUI MOVE I-KAMOKU-TEN TO O-KAMOKU-TEN WRITE OUTREC FROM W-MEISAI ELSE CONTINUE END-IF. READ INFILE AT END MOVE "1" TO W-FLAG END-READ. SHU-SHORI-EXIT. EXIT. ATO-SHORI. CLOSE INFILE OUTFILE. ATO-SHORI-EXIT. EXIT. 【出力ファイル.csv】の完成系ですが、 ________________ 社員番号 名前 科目 点数 01 ○○ 010 073   ・     ・   ・    ・   ・     ・   ・    ・ ________________ 【入力ファイル.txt】はこのような形です。 ________________ 01あああああいいいいい010070 ________________ ※入力ファイルの得点が70点以上のファイルのみ出力したいのですが・・・ 長文になってしまいましたが宜しくお願いします。

  • 可変CSVから固定CSVへのファイル加工

    perlでCSVファィルの加工するプログラムを作ろうと思っております。 プログラム初心者な為どれから手を付ければ良いのか 判りません。 宜しければ サンプル等作っていただければありがたいです。 1.指定されたフォルダの中の 最新更新日付のファイルを読み込みむ 2.5分置きに可変CSVで出力されるデータを出力を 10分単位の固定CSVへ出力する 3.出力の際には以下の固定数字、時間、文字、数字等を入れ 加工した上で固定系CSVの出力をしたいです。 ・固定の数字20450△△△, ・固定の数字 01,   ・年月日時間    YYMMDDhhmm, ・固定数字 01, ・固定文字 TP, ・固定数字 01, ・固定文字 +か-,  元データが△△△19.2の場合は+を出力  -19.2の場合は-を出力   4カラム目を19.5 の場合△△195 ・固定文字 TA, ・固定数字 01, ・固定文字 +か-,  元データが△△△12.2の場合は+を出力  -12.2の場合は-を出力   4カラム目を19.5 の場合△△195 入力のファイル名 20110301.csv ファイルの中身 17549,2011/3/25,0:00:00,19.5,12.2 17550,2011/3/25,0:05:00,19.6,12.2 17551,2011/3/25,0:10:00,19.5,12.2 17552,2011/3/25,0:15:00,19.5,12.2 17553,2011/3/25,0:20:00,19.4,12.2 17554,2011/3/25,0:25:00,19.4,12.2 17555,2011/3/25,0:30:00,19.4,12.2 17556,2011/3/25,0:35:00,19.3,12.2 17557,2011/3/25,0:40:00,19.3,12.2 17558,2011/3/25,0:45:00,19.2,12.2 17559,2011/3/25,0:50:00,-19.2,12.2 ↓ 出力のファイル名 10_200203.dat 20450 , 01,201103250010,1,TP,1,+ 195,TA,1,+ 122 20450 , 01,201103250010,1,TP,1,+ 195,TA,1,+ 122 20450 , 01,201103250020,1,TP,1,+ 194,TA,1,+ 122 20450 , 01,201103250030,1,TP,1,+ 194,TA,1,+ 122 20450 , 01,201103250040,1,TP,1,+ 193,TA,1,+ 122 20450 , 01,201103250050,1,TP,1,+ 192,TA,1,+ 122

  • COBOLについて

    COBOLについて質問です。ド素人なんですが、明日までの課題が出てしまい、教えてください。入力ファイル(給与関係の課題、例えば社員氏名・基本給・残業手当などの項目がある)を読み込んで、それを給料支給一覧表に出力するプログラムを設計せよ。要は、エクセルでまとめの表をつくるような感覚なんですが、oracob?SQL?ってレベルなので、分かる方いたら流れだけでもいいから教えて下さい。全然わからないのです。。]

  • ExcelのCSVファイル出力について

    Excelが出力したCSVファイルを扱うプログラムに関する質問です。 Windwosの[コントロールパネル]⇒[地域と言語のオプション]で、 小数点の記号を「.(ピリオド)」から「,(カンマ)」に変更しました。 するとExcelからCSVファイルを出力したときの各データの区切り文字が 「,(カンマ)」から「;(セミコロン)」に変わるようなのですが、 これに対応できるプログラムを作りたいと考えています。 CSVファイルの区切り文字は、Windowsのロケール情報として プログラム上から取得可能なのでしょうか?