新規投稿 記事一覧 ホーム
●ご利用方法,ご利用に際しての規約はこちらをお読みください。
こちらからの投稿は、先頭に表示されているコメントへの返信になります。
タブ区切り結合データの再分割 どん さん [ 7月25日(水) 16時45分 ]

    50の項目をX'05'のタブでCAT:0にて結合して1レコードにて作成しています。
    これを項目単位にて再分割したいと考えています。
    データはシングルバイト、ダブルバイトが混じっており、
    テーブルにてDO分にて比較しようにもレコードが長く移すことが出来ません。
    LOKUPを使用してタブの位置を取得出来たりすれば何とかなるのではとも考えたのですが。

    何か良い方法をご存知でしたらご教授ください。
    回答するのに情報が足りない等ありましたらご指摘ください。

    宜しくお願いいたします。

    RE:タブ区切り結合データの再分割 伊集院博 さん [ 7月26日(木) 8時57分 ]

      CPYFRMIMPFコマンドでパラメータにFLDDLM(*TAB)を指定したら良いのではないでしょうか。
      または、どんさんのおっしゃているように配列にデータをセットしてDO文で回して
      1項目づつ取り出すのが良いのかと。
      でもレコードが長すぎとあるのでもしかしたらレコード長が9999バイト超えているという事かな。
      そうなるとレコードを分割しながら、ちょっと工夫がいりますね。
      アドバイスにならなくてすみません。

    RE:タブ区切り結合データの再分割 IKD さん [ 7月26日(木) 10時2分 ]

      RPG であればレコードを外部定義として配列でオーバーレイ定義して
      LOOKUP で分割を繰り返すことができます。
      以下はテストはしていませんがサンプルとして作成したソースです。
      また C/400 であれば、strtok いう分割用の関数がありますので
      もっと簡単になります。
      RPG から分割対象のフィールドのポインターをパラメータとして
      渡せば、この C/400 を使って項目を取り出すことができます。

      【PPG サンプル: TESTTOK 】
      http://218.44.135.18/QSYS.LIB/PGMRLIB.LIB/QRPGLESC.FILE/TESTTOK.MBR
      ------------------------------------------------------------------------------------------
      -----
      0001.00 H DFTNAME(TESTTOK) DATEDIT(*YMD/)                                       
      0002.00 F******** 項目の分割 ************************************************** 
      0003.00 FDATAFL    IF   E           K DISK                                      
      0004.00 F********************************************************************** 
      0005.00 D DDS001        E DS                  EXTNAME(DATAFL)                   
      0006.00 D  VAR                    1   1024                                      
      0007.00 D                                     DIM(1024)                         
      0008.00 D CRLF            S              1B 0 INZ(X'00')                        
      0009.00 D LEN             S              4S 0                                   
      0010.00 C                   Z-ADD     1             M                 4 0       
      0011.00 C                   DO        *HIVAL                                    
      0012.00 C     CRLF          LOOKUP    VAR(N)                                 50 
      0013.00 C     *IN50         IFEQ      *ON                                       
      0014.00 C                   SUB       1             N                           
      0015.00 C                   EVAL      LEN = N - M + 1                           
      0016.00 C     LEN           SUBST     DDS01:M       ITEM            256         
      0017.00 C     N             ADD       2             M                           
      0018.00 C                   ELSE                                                
      0019.00 C                   LEAVE                                               
      0020.00 C                   END                                                 
      0021.00 C                   END
      ------------------------------------------------------------------------------------------
      -----
      【C/400 サンプル: TESTTOK】
      http://218.44.135.18/QSYS.LIB/PGMRLIB.LIB/QCSRC.FILE/TESTTOK.MBR
      ------------------------------------------------------------------------------------------
      -----
      0001.00 #include <stdio.h>                              
      0002.00 #include <stdlib.h>                             
      0003.00 #include <string.h>                             
      0004.00                                                 
      0005.00 #define TRUE         0                          
      0006.00 #define FALSE       -1                          
      0007.00                                                 
      0008.00 int  main(int argc, char *argv[]){              
      0009.00    char* str;                                   
      0010.00    char* tokenPtr;                              
      0011.00                                                 
      0012.00    memcpy(str, argv[1], 16);                    
      0013.00    tokenPtr = strtok(str, 0x05);                
      0014.00    while(tokenPtr != NULL){/*while*/            
      0015.00      printf("tokenPtr = %sn", tokenPtr);       
      0016.00      tokenPtr = strtok(NULL, 0x05);             
      0017.00    }/*while*/                                   
      0018.00 }                                               
      ------------------------------------------------------------------------------------------
      -----

    RE:タブ区切り結合データの再分割 どん さん [ 7月26日(木) 11時30分 ]

      伊集院博さん、IKDさん御回答ありがとうございます。
      早速、御教授いただいた方法にて検証してみます。

      レコード長は800〜2000程度です。複数同様のファイルがあります。
      MOVEAにてテーブルに移す際に、256以上は移せず、
      ダブルバイトがある為、256ずつに区切る事が出来ませんでした。
      開発はRPGで行っております。
      >IKDさん:RPGで付けていただいているリンクが残念ながら開けません。

      RE:タブ区切り結合データの再分割 どん さん [ 8月15日(水) 11時23分 ]

        伊集院博さん、IKDさん御回答ありがとうございます。

        遅くなりましたがご教授いただいた内容で解決できました。
        ありがとうございました。 

お名前
パスワード
e-mailアドレス
タイトル
ホームページ
アドレス