Unixパイプの発明者でUnixの伝統の創設者の一人であるダグ・マキルロイは、当時次のように述べていました[McIlroy78]。
(ii)すべてのプログラムの出力が、まだ未知の別のプログラムへの入力になることを期待します。無関係な情報で出力を乱雑にしないでください。厳密な列入力形式またはバイナリ入力形式は避けてください。インタラクティブな入力を主張しないでください。
厳密に列指向のデータは私には良いと思うので、おそらく彼が何を意味するのか理解できません。
それはどういう意味ですか、なぜそれは悪いのですか?
彼は一般的な列データではなく、aligned列を意味していると思います。とにかく厳密にを理解する方法です。例えば:
悪い:
1 200 3
100 3 400
良い:
1 200 3
100 3 400
言い換えれば、人間ではなく、コンピュータが読みやすいファイルを作成します。物事を揃えるためにスペースを追加すると、あなたと私が理解しやすくなりますが、それらを解析する必要のあるプログラムを混乱させる可能性があります。
たとえば、cut
を使用して上記の各例の2番目のフィールドを取得した場合、最初のフィールドでは失敗します。
$ cut -d' ' -f 2 bad
$ cut -d' ' -f 2 good
200
3
余分なスペースがあるため、bad
ファイルの2番目のフィールドはスペースです。ただし、good
ファイルでは期待どおりに機能します。
fixed with
およびordered columns
vs dynamic width
およびheaders
名前(7バイト)[スペース]年齢(2バイト)[スペース]高さ(5バイト)
alice 10 150cm
bob 20 160cm
carol 30 170cm
Alexander
age 40
height 180cm
を追加する必要がある場合
alice 10 150cm
bob 20 160cm
carol 30 170cm
Alexa~1 40 180cm
より柔軟な柱状構造を使用すると、スペースが不足する厳密な柱状構造に適合しません。
この痛みは、スペースで区切られた値で回避できます
alice 10 150cm
bob 20 160cm
carol 30 170cm
Alexander 40 180cm
または、1つ以上のスペースで列を分割した形式
alice 10 150cm
bob 20 160cm
carol 30 170cm
Alexander 40 180cm
スペースの数は重要ではないので、人間の読みやすさやファイル密度のためにフォーマットすることができます。Unix哲学の観点からは、ニーズに合わせてフォーマットすることができます。行は列の名前であり、次にデータスペースで区切られたファイルです。
Name Age Height
alice 10 150cm
bob 20 160cm
carol 30 170cm
Alexander 40 180cm
と
Age Height Name
10 150cm alice
20 160cm bob
30 170cm carol
40 180cm Alexander
最初の列と同じように有効です余分な列がある場合、ヘッダーは気にせず、柔軟性が向上します
Age Height t_shirt_size Name
10 150cm S alice
20 160cm M bob
30 170cm L carol
40 180cm XL Alexander
Name
、Age
、およびHeight
を読み取ることができ、関係のないヘッダーを持つ列は無視できます。まだオブジェクトにロードされます
[{"Name":"alice", "Age":10, "Height":"150cm"},
{"Name":"bob", "Age":20, "Height":"160cm"},
{"Name":"carol", "Age":30, "Height":"170cm"},
{"Name":"Alexander","Age":40, "Height":"180cm"}]
これらのルールにより、CSVのようなファイル形式になります https://tools.ietf.org/html/rfc418
Age,Height,t shirt size,Name
10,150 cm,S,alice
20,160 cm,M,bob
30,170 cm,L,carol
40,180 cm,XL,Alexander
stringently columnar data
を回避することにより、出力が入力になると予想されるまだ不明なプログラムが、変更されていないプログラムで機能する可能性が高くなります。
私のプログラムがCSVでデータを出力する場合、それは私が存在すら知らない無数のプログラムによって読み取られ、グラフ化されることができます。