web-dev-qa-db-ja.com

「厳密に列型」の入力形式を避ける必要があるのはなぜですか。

Unixパイプの発明者でUnixの伝統の創設者の一人であるダグ・マキルロイは、当時次のように述べていました[McIlroy78]。

(ii)すべてのプログラムの出力が、まだ未知の別のプログラムへの入力になることを期待します。無関係な情報で出力を乱雑にしないでください。厳密な列入力形式またはバイナリ入力形式は避けてください。インタラクティブな入力を主張しないでください。

厳密に列指向のデータは私には良いと思うので、おそらく彼が何を意味するのか理解できません。

それはどういう意味ですか、なぜそれは悪いのですか?

4
The Unfun Cat

彼は一般的な列データではなく、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ファイルでは期待どおりに機能します。

5
terdon

厳密に柱状

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

NameAge、および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でデータを出力する場合、それは私が存在すら知らない無数のプログラムによって読み取られ、グラフ化されることができます。

0
Aaron Goldman