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 with
和ordered columns
VSdynamic width
和headers
例子
固定宽度
姓名(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
我们仍然可以读出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://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 格式输出数据,那么无数个我什至不知道其存在的程序都可以读取它并绘制图表。