
■ Nullの変換
COBOLでテキストデータを読んで、レイアウト変換してテキストデータに出力するプログラムがあるのですが、この時に、入力側のテキストデータの中にNullが含まれていたため、後続の処理で障害が発生してしまいました。
嫌らしいのが、ある項目の中の一部がNullっていうパターンだってことです。
実際には下図のような感じで、テキストエディタで見ると「社内 日記」って見えるのですが、この社内と日記の間が実はNullなのです。

方法は色々とあると思いますが、INSPECT文を使って半角スペースに変換することにしました。
こんな感じです。
INSPECT WK-MSG REPLACING ALL X'00' BY X'20'.
WK-MSGは、Xタイプの項目で、問題の「社内 日記」が入っています。
INSPECT文は、項目中の値の出現回数のカウント、および置換を行うことが出来ます。ここでは、COBOL文法書でいう「書き方2」の、文字列の置き換えでの書き方です。
COBOLでNullをどう表現するか迷ったのですが、X と ' を使って16進文字定数で記述することにしました。INSPECT文で、この表記が通るか心配だったのですが、特に問題なく動いてくれました。
ちなみに、X'00' がNull、X'20' が半角スペースですので、Null値があったら、半角スペースに変換されることになります。
■ 後書き
問題のテキストファイルですが、とあるお客様から定期的に頂いているデータです。誰でも名前くらいは聞いたことがあるだろう大企業なのですが、まさかデータ中にNullを含めてくるとは思いませんでした。
この項目、そのままOracleのテーブルにINSERTされて、それを使って帳票を作成するって使い方だったのですが、帳票ソフトが項目中のNullに対応出来ずに帳票出力時に異常終了、ObjectBrowserでデータを見ると、Null以降の値が見えない(上記の例だと 社内 という値になっているように見える)し、散々でした。
っていうか、どうやって項目中にNullなんぞ突っ込んだんでしょうか。それ自体が結構難しい気がしますが・・・
それにしても、項目自体がNullだった場合の変換方法は珍しくありませんが、項目内の一部がNullというのは、意外と扱いに困ります。
今回も、INSPECT文で置換しようというのは直ぐに思いついたのですが、Null値の変換という点で少し悩むことになりました。
投稿記事の一覧:http://harikofu.web.fc2.com/
--- blog end ---
スポンサードリンク


