[ 英語 | 日本語 ]
Dは、Dファイルのファイル演算を行う一連のコマンド群である。 Dコマンド名は大文字のDではじまる。
各Dコマンドは、 Dファイルフォーマットのファイルに対し セレクションやジョイン(マッチング) などの基本的ファイル演算をおこなう。 結果も同じDファイルフォーマットで 標準出力に書き出される。 Dコマンドはシェルから呼び出され、 複数のDコマンドをつなげて、または他のコマンドとつなげて 複雑なデータ処理を行うことができる。
Dはオールインワンパッケージではない。 計算や文字列処理に関してはごく限られた機能しか持たない。 Dの基本理念はオープンシステムであり、 sedやawkやperl など、あるいはほかの様々なプログラムと組み合わせて 用いることにより力を発揮する。
Dコマンドはオペレーティングシステムのカレントロケールで 使用可能ないかなる文字も扱うことができる。 異なるロケールのもとで作成したDファイルを読み込む場合 コードエラーが起こることもあるので注意すること。
メッセージは国際化をおこなっていない。 現在の実装では英語のみである。
Windows版では短縮形は使用できない。
名称 | 短縮形 | 説明 |
DfromLine | DfL | 行データからDファイルへ |
DtoLine | DtL | Dファイルから行データへ |
DfromCsv | CsvファイルからDファイルへ | |
DtoCsv | DファイルからCsvファイルへ | |
Dpr | Dファイルの表示・印刷 | |
DtoTex | DファイルからTeXへ |
名称 | 短縮形 | 説明 |
Dselect | Dsel | 条件式を指定して検索 |
Dgrep | Dgp | 正規表現での検索 |
Dhead | Dhd | 先頭nレコードの抜出し |
Dtail | Dta | 最終nレコードの抜出し |
Dextract | Dex | レコード番号リストによる抜出し |
名称 | 短縮形 | 説明 |
Dcat | Dファイルの連結 | |
Dpaste | Dpt | Dファイルの水平マージ |
Djoin | Djn | キーフィールド値によるDファイルのジョイン・マッチング |
Dproj | Dpj | プロジェクション |
Dsort | Dst | キーフィールド値によるソート |
Dorder | Dod | Dレコード中のフィールド順の変更 |
Drename | Drn | フィールド名の変更 |
Dupdate | Dupd | Dファイルの更新 |
名称 | 短縮形 | 説明 |
Dbundle | Dbn | キー値によるDレコードの垂直マージ |
Dunbundle | Dubn | リピーティンググループによるDレコードのスライシング |
Dpack | Dpk | リピーティグフィールドの連結 |
Dunpack | Dupk | 1フィールドからリピーティグフィールドへの分割 |
Dtie | Dti | グループフィールドの連結 |
Duntie | Duti | 1フィールドからグループフィールドへの分割 |
名称 | 短縮形 | 説明 |
Drc | レコード数 | |
Drcp | Drcと表示 (Windows不可) | |
Dfd | フィールド記述 | |
Dfdp | Dfdcと表示 (Windows不可) | |
Dfreq | Dfq | フィールド値頻度表 |
Dmeans | Dmn | 記述統計 |
名称 | 短縮形 | 説明 |
Ded | 言語DlによるDファイルエディタ |
Dファイルのデータモデルは以下のように極めて単純である。
<file> | ::= <record>の順序付集合 |
<record> | ::= <field>の順序付集合 |
<field> | ::= <field name>と<value>の対 |
DファイルはDファイル規約に従うテキストファイルである。 Dファイル規約を次に示す:
以上の規約によれば<value> には改行文字(NL)をのぞくどんな文字も含むことができる。 しかし、実装の便のため次の規約を付け加える。
この規則により <value> には、 nl、 nul および soh を含むことができず、 また、 <field name> には、上記の各文字に加えCOLON を含んではならないことになる。 これらの文字をのぞけばオペレーティングシステムの カレントなロケールでサポートされる限りのすべての文字が <field name>および<value> で使用可能である。
なお、上記規約の4.により、1ファイル中最後のDレコードは空行 をともなっていなくても良いことになる。 また、規約3.によりヌルレコード(fieldの数が0のレコード)は存在し得ない。 空行が連続した場合1つのレコード区切りとなるためである。
<field name> や <value> の長さには制限がない。 また、 <record> 中の <field> の数にも制限がない。 ただし、システム上の限界は存在する。
Dファイル規約には、 メールヘッダ(RFC # 822)で使われているような スペース文字を特別扱いする規則はない。 フィールド名区切りであるCOLONの後に空白があれば それも値のうちである。 また、1 <field> を複数行にわけて表現する手段もない。
<value> も <field name> も、NULL文字列(長さ0の文字列) であってよい。 しかしながら、NULLフィールド名(field nameがNULL文字列)を使用することは 推奨できない。いくつかのDコマンドはNULLフィールド名をフィールドスキップ のような特殊な機能のために使用している。
これに対し、NULL文字列を <value> に使用することは、何の問題もない。 ただし、空値(その <field name> を持った <field>が存在しない) と、フィールドが存在してその値がNULL文字列であることとは 厳密に区別する必要がある。 次の例で最初のレコードは、フィールド"b"が空値であるが、 2番目のレコードは、フィールド"b"がNULL文字列である。
例:
a:1
a:2
b:
ミッシングバリュー(欠値)を表すのにどちらの方法を使うかは 使用者の自由であるが、 Dファイルとしてはこれらの値は異なるものとして扱われるので、 区別については意識しておく必要がある。
COLONを含まない行はエラーフィールドとなる。 エラーフィールドをどのように扱うかは、 各コマンドの実装にまかされる。 現在の実装では、一般に、 エラーフィールドは出力レコードにもそのまま残される、 という方針である。 ただし、フィールド名による選択をおこなう場合、 エラーフィールドが選択されることはない。
NULL文字およびカレントロケールでのエンコーディングに従わない バイト列は、エラーデータである。 現在の実装では、これらのバイト列は入力から無視され、 出力レコードには現れない。 なお、これらのエラーデータが入力に存在しても メッセージは出力しないし、コマンドの戻り値にも 影響しない。
Dファイル中で数値は文字列として表される。 Dコマンドが数値のフィールドを作成する場合、 数値はprintf(3)の %d(整数)または%g(実数) で変換される。 Dコマンドが文字列を数値として評価する場合、 その形式は、 strtod(3)の受け付ける10進数表現または strtol(3)の受け付ける0xではじまる16進数表現 でなければならない。 これらの形式にあわない文字列は、0として評価される。 たとえば、
a:1/2
b:123c
c:1 2 3
はすべて、上記の形式にあわないため0として評価される。 Dコマンドは、これらの形式外ゼロ評価についてメッセージは出力しない。
Dレコードには同じフィールド名のフィールドが2つ以上存在しうる。 たとえば:
a:1
b:2
a:3
b:4
Dコマンドは、原則としてこれらリピーティングフィールドを 1次元動的配列として取り扱う。 すなわち、perlでの配列のように、 0個以上の単純値を一つの名の下に取り扱うことになる。 上記例では、フィールド"a"は値{ 1 3 }、フィールド"b"は値{ 2 4 }、 そしてフィールド"c"は存在しないが、もしその名前で評価すれば 空値、すなわち値{ }をもつと見なす。
配列の要素は、単純値でなければならない。 したがって、2次元配列や行列はDコマンドで直接取り扱うことはできない。 また、リピーティングフィールドを数値として評価すると、 すべての要素は数値として評価される。 Dの配列は、数値と文字列を混在させることはできない。
Dコマンドの引数では、フィールド名に添え字を指定することはない。 もし、同一フィールド名の値を相対的位置によって異なる取り扱いをする のであれば、最初から異なるフィールド名を与えておくべきである。 ただし、D言語Dlでは、 添え字演算をサポートしている。
異なるフィールド名のフィールド順は問わない。 この原則の下に、次の2レコードは同値である。
a:1
b:2
a:3
b:4
a:1
a:3
b:2
b:4
しかし、同じフィールド名のフィールド順は有意である。 次のレコードは、上記各レコードとと異なる。 フィールド"a"の値が{ 3 1 }であり、上記レコードの{ 1 3 } とは異なっているためである。
a:3
b:2
a:1
b:4
リピーティンググループを扱うコマンド (Dunbundle や Dtie) は、フィールド順をリーフの検出に使用する。 この場合に限り、異なるフィールド名のフィールド順も 意味を持つ。 (詳細はマニュアル D_lsaを見よ)。
明示しない限り、Dコマンドは入力ファイルのフィールド順を保持する。 たとえば、フィールド順を変更する Dorder コマンドでも、フィールドリストに指定されていない フィールドのフィールド順は保持する。
値は、文字列または数値のいずれかとして比較される。 省略時では文字列比較となる。 キーフラグ(キーフィールドリスト参照) で数値を指定しない限り、文字列比較となる。 (ただし、D言語ではこの他にも数値比較となる場合がある)。
文字列の大小比較は、各文字の内部処理コードの順にしたがう。 Windowsの場合、内部処理コードはUNICODE(ISO 10646 UCS2)となる。 UNIXの場合、内部処理コードはロケールによっても異なる。 各オペレーティングシステムのマニュアルを参照すること。
数値比較をする場合、文字列は数値に変換された後変換される。 数値として正しくない形式の文字列は、0に変換されるので注意すること。 (数値参照)。
リピーティングフィールドの場合、最初の要素同士を比較し、 それが等しい場合、次に2番目の要素同士を比較する というように等しくない要素が現れるまで、 あるいは片方の要素がなくなるまで続く。 片方の要素が尽きだ場合、つきた側が小さいと定義する。 言葉を換えれば、存在しないフィールドは最小の 値(NULL文字列より小、マイナス無限より小)を持つと考えることにあたる。
2つ以上のフィールドを組み合わせて比較する場合も同様である。 フィールド"a,b"を比較する場合、まずフィールド"a"同士を比較し、 それらが等しいときフィールド"b"同士を比較する。 フィールド"a"とフィールド"b"のレコード内でのフィールド順は 比較に影響しない。
Dコマンドの引数は次の規則にしたがう。
次のオプションは多くのDコマンドにおいて同じ意味で使用される。
-? | ヘルプ |
-F | ファイルごとの処理、"filename"フィールド付加 |
-g | グループ化 |
-k | 省略時キーオプション (キーフィールドリスト参照) |
-t | フォーマットの省略時区切り字列(D_fmt 参照) |
-z | フォーマットの省略時オプション(D_fmt 参照) |
いくつかのDコマンドでは引数で正規表現を使用する。 正規表現はUNIXのegrep仕様にしたがう。
| | 左辺または右辺にマッチ |
* | 直前のものの0個以上にマッチ |
+ | 直前のものの1個以上にマッチ |
? | オプショナル; 直前のものの0個または1個にマッチ |
( ) | グルーピング; 正規表現のグループ化 |
. | 1文字; 任意の1文字にマッチ |
^ | 先頭; 文字列の先頭の空文字列にマッチ |
$ | 末尾; 文字列の末尾の空文字列にマッチ |
\ | エスケープ; 続く1文字にマッチ |
[...] | 範囲; 囲まれた中の任意の1文字にマッチ |
[^...] | 排他範囲; 囲まれた中の先頭の"^"を除く任意の1文字にマッチ |
- | []中、この左の文字から右の文字まで 内部処理コードとして連続した文字を並べたものの略記 |
[ ]の中で"\"はエスケープとして働かないことに注意すること。 また[ ]の中で"]"、"^"または"-"を 使用するには、それらの文字を意味のないところに配置する。 は先頭("["の直後または、"[^"の直後)におけばよい。 "^"は先頭以外の場所におけば普通の文字として扱われる。 "-"は先頭または最後におけば普通の文字扱いとなる。 なお、"-"の使用にあたっては内部コード についての知識が必要とされるので注意すること。
現在の実装における正規表現処理ルーチンは Henry SpencerのV8 regular expressionにもとづき 国際化に関する変更をおこなったものである。 この正規表現でのマッチは、常に「文字」にもとづき 「バイト」は扱わない。
多くのDコマンドにおいて フィールドリスト がオペランドやオプションの引数に使われる。 フィールドリストはCOMMAまたはSPACEで区切られた フィールド名のならびである。 コマンドを呼び出すシェルにおいて、 SPACEで区切られたフィールドリストを使うには クォーティングを行わなければならない。 たとえば、UNIXのシェルでは次の3つのフィールドリスト
a,b,c
"a b c"
a\ b\ c
は同値である。 (3番目の例はほとんど使われないと思われるが)。
フィールドリストの文法をやや形式的に書くと次のようになる。
<field-list> | ::= | [^] [<fspec> [{<dlm><fspec>}..]] |
<fspec> | ::= | <field name>[:<additional-inf>] |
<dlm> | ::= | <sp>[<sp>..] |
| | [<sp>..],[<sp>..] | |
<sp> | ::= | SPACE | TAB | NEWLINE |
文字REVERSE SOLIDUS (\)は COMMA(,)、CIRCUMFLEX ACCENT(^) または上記の<sp>をエスケープするために使用する。 フィールド名中にこれらの文字を使用するとき、 エスケープを使用する。 たとえばUNIXのシェルでは:
"\^a\,b\ \"
\\\^a\\,b\\\ \\
の両方がフィールド名"^a,b \"を表す。 REVERSE SOLIDUS (\)が取り除かれるのは COMMA、CIRCUMFLEX ACCENTおよび空白文字の前に置かれたときだけであり、 他の位置に置かれたREVERSE SOLIDUSはそのまま残される。 たとえば
"\START\,\END"
は"\START,\END"というフィールド名になる。
フィールドリストには、各フィールド名ごとに付加情報をつけることができる。 付加情報は、フィールド名の後ろにCOLONで区切ってつなげる。 この付加情報の中でも"\" エスケープは有効となる。 付加情報はキーフラグ、入出力フォーマット、新フィールド名などを指定する ために使われる。 この付加情報の種類によってフィールドリストは キーフィールドリスト、 フィールドフォーマットリスト、 リーフフィールドリスト、 または フィールドリネームリスト となる。 これらの特定フィールドリストについては以下の節を参照のこと。
フィールドフォーマットリストの一般形は
field-name[:format]
というエントリのリストである。 フィールドフォーマットリストは、 文字列をDフィールドに、または Dフィールドから文字列に変換するための 方法を指定する。 フィールドフォーマットリストには 2つのオプション -t と -z によって省略時オプションが指定できる。
フォーマットの詳細についてはマニュアル D_fmt を参照。
キーフィールドリストの一般形は
field-name[:key-flags]
というエントリの並びである。 キーフィールドリストはキー値として使うフィールドを その属性(例えば文字列か数値かなど)とともに指定する。 キーフィールドリストについては -k オプションによって省略時キーフラグを与えることができる。
キーフラグは次の文字からなる文字列である。 (これらのフラグの意味はUNIXのsortと同じでそのサブセットになっている)。 これらによってフィールドのキー属性を指定する。
-k オプションのフラグはキーフラグリストのうち キーフラグをともなっていないフィールドに有効である。 したがって、次の各例は同じ意味になる。
"a,b:nr"
-k nr "a: b"
-k n "a: b:nr"
しかし、次の例は上記例とは異なる。
-k n "a: b:r"
フィールド"b"はこの場合数値フィールドとはならない。
キーフラグ"f"と"d"はロケールのライブラリが サポートしていればASCII以外の文字についても有効である。
キーフラグリスト中に同一フィールド名が重複していても かまわない。ただし、その場合の解釈は各コマンドによって 決められる。 多くの場合、最初のものだけが有効となる。
リーフフィールドリストの一般形は
fieldname[:*]
というエントリの並びである。 リーフフィールドリストは、 Dunbundle および Dtie で、リーフとして扱われるフィールド群を その繰り返し可能性とともに指定する。 Dtie の場合、リーフフィールドリストは 同時にフィールドフォーマットリストも兼ねる。 実際リーフフィールドリストはフィールドフォーマットリストの サブセットであり、そのうちのフィールド名と"*" とだけが使用される。
詳細は、マニュアル D_lsa を参照。
フィールドリネームリストの一般形は
old-field-name:new-field-name
というエントリの並びである。 フィールドリネームリストは Drename で、フィールド名の変更を指定するのに使用される。 "\"によるエスケープはnew-field-name中にも適用される。 たとえば、フィールド名"a-b"を"a b"に変更するには 次のフィールドリネームリストを用いる。
"a-b:a\ b"
COLONがnew-field-nameに入っているかどうかのチェックは行わないので
"a:b:c"
というフィールドリネームリストを書くことはできるが、 結果は値の先頭に"c:"という文字列のついたフィールド"b" を作るだけである。 将来のバージョンではこのチェックを行う可能性もあり、 このような使用法は推奨できない。
CIRCUMFLEX ACCENT(^)ではじまるフィールドリストは 排他を意味する。(この記法は正規表現の[^..]から来ている。) 排他フィールドリストはフィールドリストを使用できるところでは コマンドでの意味に矛盾のない限り使用できる。 一方の極端で、"^"は「すべてのフィールド」を意味するものとして 使用できる。
ただし、排他フィールドリストでは付加情報は意味を持たず、 書いても無視される。 しかし、排他フィールドリストを field-format-listや key-field-list に用いることに問題はない。 これらの特定フィールドリストに排他フィールドリストを用いた場合、 省略時のフォーマットやキーフラグが用いられる。
排他フィールドリストのDコマンド中の処理では 内部的に作業用フィールドリストが作られる。 このフィールドリストはプログラムの開始時点では 空になっている。処理を始めると排他フィールドリストに ないフィールド名を見つけるごとに、そのフィールド名を 作業用フィールドリストに登録する。 この作業用フィールドリストが処理用に使用されるため 実際のフィールドリストの順は入力ファイルに依存して決まる。
このことは Dorder や key-field-list のようにフィールド順に意味のある場合重要となる。 たとえば、次の用に指定した場合、
Dsort ^a file1 > tmp1
Dsort ^a file2 > tmp2
Djoin ^a tmp1 tmp2
3番目のDjoin コマンドでエラーとなることがある。 なぜなら、最初のDsortdでできる作業用フィールドリスト と次のDsortdでできる作業用フィールドリスト とが同じとは限らないためである。
Dコマンドは結果の出力を標準出力ファイルに出す。 メッセージを出力する場合は標準エラーファイルに出す。 DtoLine、 DtoTex、 および Dpr は、例外で標準出力に Dファイルでないものを出力する。 Dsort は、標準出力、標準エラー以外に 一時ファイルとしてソートワークファイルを、 Windosの Dpr はプリンタ出力時に一時ファイルを使用する。 これらだけが、標準出力、標準エラー以外のファイルに 出力する例外である。
Dコマンドのいくつかは、出力中に決まったフィールド名の フィールドを使用する。 たとえば、 Dcat および他のいくつかのDコマンドは"filename"フィールドを出力する。
これら既定フィールド名は、たとえ入力ファイル中に同名のフィールドが あったとしても変更はされない。 この場合、"filename"フィールドがリピーティングフィールドとして出力中に 現れることになる。 Dコマンドの付加するフィールドが、既存のフィールドより前に来るか 後にくるかは、各Dコマンドの仕様により定まる。 Dcat の場合、"filename"フィールドは常にレコードの先頭のフィールドとして 付加される。
リピーティングフィールドになるのが都合悪い場合、 Drename によってあらかじめ既存のフィールド名を変更しておくこと。 既定フィールド名を変更する手段は他にはない。
Dコマンドの戻り値はすべて0から3の値で、その意味は次の通りである。
MIYAZAWA Akira