严格柱状

严格柱状

Doug McIlroy,Unix 管道的发明者和 Unix 传统的创始人之一,当时说过这样的话 [McIlroy78]:

(ii) 期望每个程序的输出成为另一个未知程序的输入。不要用无关的信息来扰乱输出。避免严格的柱状或二进制输入格式。不要坚持交互式输入。

严格的柱状数据对我来说听起来不错,所以我可能不明白他的意思。

这是什么意思以及为什么不好?

答案1

我猜他的意思是对齐列,而不是一般的列数据。这就是我的理解严格地反正。例如:

坏的:

1    200 3
100  3   400

好的:

1 200 3
100 3 400

换句话说,创建易于计算机读取而不是人类读取的文件。添加空格来对齐事物使它们变得漂亮并且更容易让你和我理解,但可能会使需要解析它们的程序感到困惑。

例如,如果我要用来cut获取上述每个示例的第二个字段,则第一个字段将失败:

$ cut -d' ' -f 2 bad


$ cut -d' ' -f 2 good 
200
3

由于存在多余的空格,bad文件的第二个字段是空格。但是,它按文件中的预期工作good

答案2

严格柱状

fixed withordered columnsVSdynamic widthheaders

例子

固定宽度

姓名(7 个字节)[空格] 年龄(2 个字节)[空格] 身高(5 个字节)

alice   10 150cm 
bob     20 160cm
carol   30 170cm

如果我现在需要添加Alexander年龄40身高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://www.rfc-editor.org/rfc/rfc4180

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 格式输出数据,那么无数个我什至不知道其存在的程序都可以读取它并绘制图表。

相关内容