加载数据

    Nu 在处理数据方面最强大的能力之一是open命令。它是一个多功能命令,可以处理许多不同的数据格式。为了说明这一点让我们试着打开一个 JSON 文件:

    与类似,打开一个 Nu 支持的文件类型,会返回一些不仅仅是文本(或一个字节流)的东西。这里我们打开了一个来自 JavaScript 项目的 “package.json” 文件。Nu 可以识别 JSON 文本并将其解析为一个数据表。

    如果我们想查看当前项目的版本,我们可以使用get命令:

    1. 1.0.0

    Nu 目前支持直接从以下格式加载表数据:

    • csv
    • eml
    • ics
    • ini
    • json
    • nuon
    • ods
    • ssv
    • toml
    • tsv
    • url
    • vcf
    • xlsx / xls
    • xml
    • yaml / yml

    但是,当你加载其他的文本文件时会发生什么呢?让我们试一试:

    1. > open README.md

    我们会看到该文件的内容,如果文件太大则会得到一个方便的滚动视图来查看文件,然后再跳回终端。为了提高可读性,Nu 还将语法高亮显示常见的文件格式,如源码文件、Markdown 等等。

    处理来自 Nu 外部数据时一个普遍情况是,它并不总是以 Nu 理解的格式出现。通常这些数据是以字符串的形式提供给我们的。

    想象一下,我们得到了这个数据文件:

    1. > open people.txt
    2. Octavia | Butler | Writer
    3. Antonio | Vivaldi | Composer

    我们想要的数据都由管道(|)符号隔开,每人单独一行。由于 Nu 没有默认的以管道分隔的文件格式,所以我们必须自己来解析。

    当我们引入这个文件时,我们需要做的第一件事是确保后续每次只处理一行:

    可以看到,我们正在处理这些行,因为我们又回到了一个表中。下一步是看看是否可以把行分割成更有用的东西。为此,我们将使用命令。split,顾名思义,为我们提供了一种分割字符串的方法。我们将使用的column子命令,将内容分成多列。我们会告诉它分隔符是什么,剩下的就由它来完成:

    1. > open people.txt | lines | split column "|"
    2. ───┬──────────┬───────────┬───────────
    3. # │ column1 │ column2 │ column3
    4. ───┼──────────┼───────────┼───────────
    5. 0 Octavia Butler Writer
    6. 1 Bob Ross Painter
    7. 2 Antonio Vivaldi Composer
    8. ───┴──────────┴───────────┴───────────

    这看起来差不多了,只是还有一些额外的空白字符,让我们 trim 掉这些空格:

    1. > open people.txt | lines | split column "|" | str trim
    2. ───┬─────────┬─────────┬──────────
    3. ───┼─────────┼─────────┼──────────
    4. 0 Octavia Butler Writer
    5. 1 Bob Ross Painter
    6. 2 Antonio Vivaldi Composer
    7. ───┴─────────┴─────────┴──────────
    1. > open people.txt | lines | split column "|" | str trim | get column1
    2. ───┬─────────
    3. 0 Octavia
    4. 1 Bob
    5. 2 Antonio
    6. ───┴─────────

    我们也可以用自定义的列名代替默认的:

    现在,我们的数据加载到一个表中了,我们可以使用之前对表所用的各种命令来处理它:

    1. > open people.txt | lines | split column "|" first_name last_name job | str trim | sort-by first_name
    2. # │ first_name │ last_name │ job
    3. ───┼────────────┼───────────┼──────────
    4. 0 Antonio Vivaldi Composer
    5. 1 Bob Ross Painter
    6. 2 Octavia Butler Writer

    其他可用于字符串的命令有:

    如果我们已经知道待处理的数据具有 Nu 能够理解的格式,则可以使用一些辅助命令,例如,我们打开一个 Rust 的 Cargo.lock 文件:

    1. > open Cargo.lock
    2. # This file is automatically @generated by Cargo.
    3. # It is not intended for manual editing.
    4. [[package]]
    5. name = "adhoc_derive"
    6. version = "0.1.2"

    “Cargo.lock” 实际上是一个 .toml 文件,但是文件扩展名不是 .toml。没关系,我们可以使用 from toml 命令:

    1. > open Cargo.lock | from toml
    2. ──────────┬───────────────────
    3. metadata [row 107 columns]
    4. package [table 130 rows]
    5. ──────────┴───────────────────

    每种 Nu 能打开并理解的结构化数据文本格式都有对应的 from 命令可以使用,只需要把支持的格式作为子命令传给 from 就可以了。

    除了从文件系统中加载文件,你还可以通过使用命令来加载 URLs。这将从互联网上获取 URL 的内容并返回:

    1. > fetch https://blog.rust-lang.org/feed.xml
    2. ──────┬───────────────────
    3. ──────┴───────────────────