展开 Nushell 中的折叠数据



我正在尝试学习 nushell,从文档中的这个例子中,

> echo [[column1, column2]; [Value1, Value2]]
───┬─────────┬─────────
# │ column1 │ column2
───┼─────────┼─────────
0 │ Value1  │ Value2
───┴─────────┴─────────

但我的输出是:

echo [[column1, column2], [Value1, Value2]]  
╭───┬────────────────╮
│ 0 │ [list 2 items] │
│ 1 │ [list 2 items] │
╰───┴────────────────╯

如何展开折叠的信息?

听起来你真正想做的是将一个 Nushell 列表列表转换为一个表(一个记录列表)。 我自己有点惊讶,没有(至少我能找到)更简单的方法(即内置命令)来执行这种强制,但是有几种方法可以实现它。 但是,我仍然觉得有一种更简单的方法,我只是看不到自己。

无论如何,对于您的特定示例,我能想到的最简单的方法:

〉[[column1, column2], [Value1, Value2]] | each { { 0: $in.0, 1: $in.1 }} | headers
╭───┬─────────┬─────────╮
│ # │ column1 │ column2 │
├───┼─────────┼─────────┤
│ 0 │ Value1  │ Value2  │
╰───┴─────────┴─────────╯

请注意,在大多数情况下,您可以删除echo命令并获得完全相同的结果。

另请注意,通过更早地转换数据可能会有更简单的答案,但您没有提及数据的来源。 数据的原始来源不太可能是"现实世界"中的Nushell"列表文字"。 但出于纯粹的学术/学习目的,这当然值得理解。

<小时 />

说明:

你上面的第一个数据类型(来自文档示例)确实是一个 Nushell 表:

〉[[column1, column2]; [Value1, Value2]] | describe
table<column1: string, column2: string>

第二个是列表列表:

〉 [[column1, column2], [Value1, Value2]] | describe
list<list<string>>

另请注意,上面的文档示例可能被认为有点过时。 当它被编写时,它是在Nushell中构造表文本的唯一方法(并且仍然可能被认为是"表文本"语法)。 但是在 0.40 中添加的记录语法为我们提供了一种将表文本指定为"记录列表"的新方法。 您现在可以使用(恕我直言)更具可读性(或至少是"标准"):

[{ 'column1':'value1', 'column2':'value2' }]

也就是说,如果您确实需要为表指定多行,则[[column1, column2]; [Value1, Value2]]表单会更加简洁。 但是这是否是"现实世界"的使用是另一个问题,在Nushell达到1.0之前删除"旧"表文字语法,我不会感到惊讶。

这是我们用来回答您问题的新"记录列表"表格:

[[column1, column2], [Value1, Value2]] | each { { 0: $in.0, 1: $in.1 }} | headers
  • 对于每对(例如[Value1, Value2]) 创建一个记录,其中第一个值设置为键0,第二个值设置为键1

  • each的结果会自动收集到列表中。

  • 由于最终结果是"每个记录类型相同的记录列表",因此它会生成一个表。 如果其中一行不同(例如,它有一个整数而不是一个字符串),那么结果看起来是一样的,但实际输出将是"记录列表"。

  • headers命令用于获取标题名称并使用它们而不是01

奖金:

以下内容将显示具有任意数量值的列表:

[[Column1, Column2, Column3 ], [Value1, Value2], [Value3, Value4, Value5], [Value6]] |
each { |values|
reduce -f {} { |it,acc|
$acc | insert $"Field($acc | transpose | length)" $it
}
} | headers

结果:

╭───┬─────────┬─────────┬─────────╮
│ # │ Column1 │ Column2 │ Column3 │
├───┼─────────┼─────────┼─────────┤
│ 0 │ Value1  │ Value2  │         │
│ 1 │ Value3  │ Value4  │ Value5  │
│ 2 │ Value6  │         │         │
╰───┴─────────┴─────────┴─────────╯

解释(如果您还不熟悉reduce):

  • 循环遍历(外部)列表中的每个(内部)值列表
  • 将这些内部值列表中的每一个"简化"为记录:
    • 以空记录开头-f {}$acc
    • 将每个字段插入为Field0Field1等。
    • 结果将附加到$acc,该在缩减结束时成为完整记录。
    • 由于我需要提交的错误,| transpose | length是一个笨拙的解决方法。 当我这样做时,我会把它链接回这里。

最新更新