データの読み込み
これまでに、ls
、ps
、date
、およびsys
コマンドを使って、ファイル、プロセス、日付そしてシステム自身の情報を取得する方法をみてきました。各コマンドはテーブル情報を提供しますが、他にもデータをテーブルに読み込む方法があります。
ファイルを開く
データを操作するための Nu の最も強力なコマンドのひとつがopen
コマンドです。これは様々なデータ形式に対応したマルチツールです。これがなにを意味するかをみるために、json ファイルを開いてみましょう。
> open editors/vscode/package.json
──────────────────┬───────────────────────────────────────────────────────────────────────────────
name │ lark
description │ Lark support for VS Code
author │ Lark developers
license │ MIT
version │ 1.0.0
repository │ [row type url]
publisher │ vscode
categories │ [table 0 rows]
keywords │ [table 1 rows]
engines │ [row vscode]
activationEvents │ [table 1 rows]
main │ ./out/extension
contributes │ [row configuration grammars languages]
scripts │ [row compile postinstall test vscode:prepublish watch]
devDependencies │ [row @types/mocha @types/node tslint typescript vscode vscode-languageclient]
──────────────────┴───────────────────────────────────────────────────────────────────────────────
ls
と同様、Nu が理解できるタイプのファイルを開くと、単なるテキスト(またはバイトストリーム)以上のものが返ってきます。ここでは、JavaScript プロジェクト内の"package.json"ファイルを開いています。Nu は JSON テキストを認識し、テーブルデータを返すことができます。
プロジェクトのバージョンを確認したい場合は、get
コマンドを利用します。
> open editors/vscode/package.json | get version
1.0.0
Nu が現在、直接データをテーブルに読み込める形式は次の通りです。
- json
- yaml
- toml
- xml
- csv
- ini
しかし、これらのいずれでもないテキストファイルを読み込むとどうなるでしょうか、試してみましょう。
> open README.md
ファイルの内容が表示されます。ファイルが大きすぎる場合は、便利なスクロールビューでファイルの中身を確認してからターミナルに戻ってくることができます。読みやすさのために、ソースファイルやマークダウンといった一般的なファイル形式ではシンタックスハイライトを提供します。
裏側では、Nu はこれらのファイルをひとつの大きな文字列としてみています。次に、これらの文字列から必要なデータを取得する方法について説明します。
文字列を扱う
Nu の外からきたデータを Nu がいつも理解できるとは限らないことを理解しておくのは重要なことです。多くの場合このデータは文字列として与えられます。
以下のファイルが与えられたと想定してみましょう。
> open people.txt
Octavia | Butler | Writer
Bob | Ross | Painter
Antonio | Vivaldi | Composer
必要なデータはパイプ('|')記号で区切られており、各行はそれぞれの人物を表しています。Nu はデフォルトではパイプで区切られたファイル形式を知らないので、明示的にこのファイルをパースする必要があります。
ファイルを読み込むときに最初に行うことは、1行ずつ作業することです。
> open people.txt | lines
───┬──────────────────────────────
0 │ Octavia | Butler | Writer
1 │ Bob | Ross | Painter
2 │ Antonio | Vivaldi | Composer
───┴──────────────────────────────
テーブルにもどってきたので、行を使って作業していることがわかります。次のステップは、行をもうすこし便利なものに分割できるかみてみることです。そのために、split
コマンドを利用します。名前からわかるように、split
は区切り文字を含む文字列を列に分割する方法を提供します。split
のcolumn
サブコマンドを使って、複数の列に分割するします。必要なのは区切り文字を指定することだけです。
> open people.txt | lines | split column "|"
───┬──────────┬───────────┬───────────
# │ Column1 │ Column2 │ Column3
───┼──────────┼───────────┼───────────
0 │ Octavia │ Butler │ Writer
1 │ Bob │ Ross │ Painter
2 │ Antonio │ Vivaldi │ Composer
───┴──────────┴───────────┴───────────
ほとんど正しいように見えますが、余分なスペースを含んでいます。余分なスペースをtrim
してみましょう。
> open people.txt | lines | split column "|" | str trim
───┬─────────┬─────────┬──────────
# │ Column1 │ Column2 │ Column3
───┼─────────┼─────────┼──────────
0 │ Octavia │ Butler │ Writer
1 │ Bob │ Ross │ Painter
2 │ Antonio │ Vivaldi │ Composer
───┴─────────┴─────────┴──────────
悪くありません。split
コマンドは利用可能なデータとデフォルトのカラム名をつけてくれます。
> open people.txt | lines | split column "|" | str trim | get Column1
───┬─────────
0 │ Octavia
1 │ Bob
2 │ Antonio
───┴─────────
デフォルトの名前を利用するかわりに、列に名前をつけることもできます。
> open people.txt | lines | split column "|" first_name last_name job | str trim
───┬────────────┬───────────┬──────────
# │ first_name │ last_name │ job
───┼────────────┼───────────┼──────────
0 │ Octavia │ Butler │ Writer
1 │ Bob │ Ross │ Painter
2 │ Antonio │ Vivaldi │ Composer
───┴────────────┴───────────┴──────────
データをテーブルに変換できたので、これまでテーブルに利用してきたすべてのコマンドをつかうことができます。
> open people.txt | lines | split column "|" first_name last_name job | str trim | sort-by first_name
───┬────────────┬───────────┬──────────
# │ first_name │ last_name │ job
───┼────────────┼───────────┼──────────
0 │ Antonio │ Vivaldi │ Composer
1 │ Bob │ Ross │ Painter
2 │ Octavia │ Butler │ Writer
───┴────────────┴───────────┴──────────
文字列を操作するために使用できるその他のコマンドです。
- str
- lines
- size
データが Nu が理解できる構造をもっていることがわかっている場合に呼び出すことのできるヘルパーコマンドのセットもあります。例えば、Rust のロックファイルを開いてみましょう。
> open Cargo.lock
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
[[package]]
name = "adhoc_derive"
version = "0.1.2"
"Cargo.lock"ファイルは実際には.toml ファイルですが、ファイル拡張子が.toml ではありません。でも大丈夫です、from toml
コマンドが使えます。
> open Cargo.lock | from toml
──────────┬───────────────────
metadata │ [row 107 columns]
package │ [table 130 rows]
──────────┴───────────────────
from
コマンドはサポートされているテキストフォーマットをサブコマンドとして渡すことで Nu が扱える構造化データごとに利用できます。
raw モードで開く
ファイルを開いてそのデータのテーブルをすぐに操作できると便利ですが、これは必ずしもやりたいことであるとは限りません。テキストをそのまま取得するために、open
コマンドに--raw
オプションフラグを渡すことができます。
> open Cargo.toml --raw
[package] name = "nu"
version = "0.1.3"
authors = ["Yehuda Katz <wycats@gmail.com>", "Sophia Turner <547158+sophiajt@users.noreply.github.com>"]
description = "A shell for the GitHub era"
license = "MIT"
URL からの取得
ファイルシステムからファイルを読み込むことに加えて、http get
コマンドを利用して URL からリソースを取得できます。 これはインターネットから URL の内容をフェッチして返してくれます。
> http get https://blog.rust-lang.org/feed.xml
╭────────────┬──────────────────╮
│ tag │ feed │
│ attributes │ {record 1 field} │
│ content │ [table 18 rows] │
╰────────────┴──────────────────╯