DtoCsv [ -p field-list ] [ input-file.. ]
DtoCsvは,input-filesの Dレコードをcsv(Comma Separated Values)ファイルに 変換する。
入力Dファイルはそれぞれ, ラベル行と,後続するデータ行に変換される。 入力ファイルが複数ある場合,2番目の入力フィル から変換された各行は,最初のファイルからの最終行に すぐ続いて出力される。 (2番目以降のラベル行を 出力結果だけから識別することは,一般にはできない)。
ラベル行はCOMMA (,)で区切られた フィールド名からなる。 データ行はDレコードから作られ, その値は対応するDフィールドの値で, 必要な場合QUOTATION MARKでくくられる。 Dレコードに対応するDフィールドがない場合, 値はNULL文字列となる。 対応するフィールドが複数ある(リピーティングフィールドの) 場合,値を改行文字でつないで, QUOTATION MARKでくくる。
Dファイルにはフィールドのディレクトリはなく, また,ひとつのDファイルに異なる種類のDレコードが 入っていてもかまわないため, どのフィールドをいかなる順で出力するかを決めるのは 単純ではない。 このためDtoCsvには,出力前に インスペクションフェーズがある。 このフェーズでは出力を行わずに 入力レコードをため込んで, フィールド名とその順の調査を行う。 インスペクションフェーズが終わると DtoCsvはラベル行を書き出し, ため込んだレコードのデータ行を作成・出力し, 続いて入力ファイルの残ったレコードの変換を行う。 したがって,インスペクションフェーズで 現れなかったフィールドは出力されない。
通常,DtoCsvは,インスペクションフェーズで, Dレコードを合計 8192文字(改行文字を含む)または 合計1024フィールドまで読み込む。 最初のレコードがこれに入りきらないほど大きい場合, スペースを拡張して最低1レコードは読み込む。
インスペクションフェーズにおける読み込みレコード数は, オプション-Dのirecsパラメータで制御できる。 DtoCsvは,インスペクションフェーズで 少なくともirecsレコードを読み込む。 irecsの省略時値は1である。
オプション -p field-list を指定すると,リストに現れたフィールドのみ リストの順で出力される。 この場合,インスペクションフェーズは 存在しない。
ここに示すCSVフォーマット仕様は, このプログラムが作成するファイルの仕様で, かの有名なソフトウェアとの互換性はあるが, その他のソフトウェアとの互換性は保証できない。 Csvフォーマットのその他の変種にあわせた 出力をするためには, DtoLine を使えば,より細かい(したがって面倒な) 指定ができる。
ラベル行でもデータ行でも,値はCOMMA(,) で区切られる。 値にCOMMA,QUOTATION MARK(")または 改行文字が含まれる, もしくはSPACEが先頭または最後に含まれるとき, 値全体がQUOTATION MARKで囲まれる。 またこのとき,値中のQUOTATION MARKは, 2文字の連続したQUOTATION MARKに置き換えられる。
ラベル行とデータ行の値の個数はいつも等しい。
Dファイルdata.dからcsvファイルdata.csv への単純な変換。最初の8192文字に含まれるフィールドが 変換対象となる。
DtoCsv data.d > data.csv
最初の100レコードですべてのフィールドが出現すると わかっているとき,-D irecs=を用いれば, すべてのフィールドが変換されることを保証できる。
DtoCsv -Direcs=100 data.d > data.csv
フィールドa,b,c だけでcsvファイルを作る。
DtoCsv -p a,b,c data.d > data.csv
フィールド名を間違えると何も出力されない ので注意。警告メッセージもない。
マニュアル D_msg 参照。
MIYAZAWA Akira