|
| 1 | +# Laden von Daten |
| 2 | + |
| 3 | +Im letzten Kapitel wurden Befehle wie [`ls`](/book/commands/ls.md), [`ps`](/book/commands/ps.md), |
| 4 | +[`date`](/book/commands/date.md), and [`sys`](/book/commands/sys.md) vorgestellt um Informationen |
| 5 | +über Dateien, Prozesse, Zeiten und die Systemumgebung selber zu laden. |
| 6 | +Jeder Befehl ergibt eine Tabelle aus, mit der gearbeitet werden kann. |
| 7 | +Es gibt jedoch noch andere Möglichkeiten Tabellen aus Daten zu erhalten. |
| 8 | + |
| 9 | +## Dateien öffnen |
| 10 | + |
| 11 | +Einer der mächtigsten Befehle in Nu um mir Daten zu arbeite ist der [`open`](/book/commands/open.md) Befehl. |
| 12 | +Er ist ein Multi-Werkzeug, welcher mit verschiedensten Datenformaten umgehen kann. |
| 13 | +Hier zum Beispiel was passiert, wenn eine json Datei geöffnet wird: |
| 14 | + |
| 15 | +``` |
| 16 | +> open editors/vscode/package.json |
| 17 | +──────────────────┬─────────────────────────────────────────────────────────────────────────────── |
| 18 | + name │ lark |
| 19 | + description │ Lark support for VS Code |
| 20 | + author │ Lark developers |
| 21 | + license │ MIT |
| 22 | + version │ 1.0.0 |
| 23 | + repository │ [row type url] |
| 24 | + publisher │ vscode |
| 25 | + categories │ [table 0 rows] |
| 26 | + keywords │ [table 1 rows] |
| 27 | + engines │ [row vscode] |
| 28 | + activationEvents │ [table 1 rows] |
| 29 | + main │ ./out/extension |
| 30 | + contributes │ [row configuration grammars languages] |
| 31 | + scripts │ [row compile postinstall test vscode:prepublish watch] |
| 32 | + devDependencies │ [row @types/mocha @types/node tslint typescript vscode vscode-languageclient] |
| 33 | +──────────────────┴─────────────────────────────────────────────────────────────────────────────── |
| 34 | +``` |
| 35 | + |
| 36 | +Ähnlich wie beim [`ls`](/book/commands/ls.md) Befehl, bekommen wir mehr als nur Text |
| 37 | +(oder einen Stream von bytes) zurück, wenn wir einen Dateityp öffnen, den Nu versteht. |
| 38 | +Hier wurde ein "package.json" von einem JavaScript Projekt geöffnet. Nu erkennt den json text |
| 39 | +und parst die Daten in eine Tabelle. |
| 40 | + |
| 41 | +Soll nur die Version aus dem Projekt angezeigt werden, kann mit dem [`get`](/book/commands/get.md) |
| 42 | +direkt diese Information herausgelesen werden. |
| 43 | + |
| 44 | +``` |
| 45 | +> open editors/vscode/package.json | get version |
| 46 | +1.0.0 |
| 47 | +``` |
| 48 | + |
| 49 | +Nu unterstützt aktuell die folgenden Formate um Daten direkt als Tabelle zu öffnen: |
| 50 | + |
| 51 | +- csv |
| 52 | +- eml |
| 53 | +- ics |
| 54 | +- ini |
| 55 | +- json |
| 56 | +- nuon |
| 57 | +- ods |
| 58 | +- ssv |
| 59 | +- toml |
| 60 | +- tsv |
| 61 | +- url |
| 62 | +- vcf |
| 63 | +- xlsx / xls |
| 64 | +- xml |
| 65 | +- yaml / yml |
| 66 | + |
| 67 | +Was aber passiert, wenn eine Text Datei geladen wird, die keinem der angegebenen Formate entspricht? |
| 68 | + |
| 69 | +``` |
| 70 | +> open README.md |
| 71 | +``` |
| 72 | + |
| 73 | +Die Datei wird wie gewohnt als Text ausgegeben. |
| 74 | + |
| 75 | +Im Hintergrund sieht Nu eine reine Text Datei als einen grossen String. |
| 76 | +Wie man mit einem String umgeht und die benötigten Daten herauszieht, steht im nächsten Kapitel. |
| 77 | + |
| 78 | +## Mit Strings umgehen |
| 79 | + |
| 80 | +Ein wichtiger Teil der Arbeit mit Nu ist es, mit externen Daten um zu gehen, die Nu nicht versteht. |
| 81 | +Oft werden diese Daten als String repräsentiert. |
| 82 | + |
| 83 | +Zum Beispiel wie in dieser Datei: |
| 84 | + |
| 85 | +``` |
| 86 | +> open people.txt |
| 87 | +Octavia | Butler | Writer |
| 88 | +Bob | Ross | Painter |
| 89 | +Antonio | Vivaldi | Composer |
| 90 | +``` |
| 91 | + |
| 92 | +Jeder Datenpunkt ist durch ein pipe ('|') Symbol getrennt. Und jede Person steht auf einer |
| 93 | +eigenen Zeile. Nu kennt standardmässig kein Dateiformat, welches pipe-getrennt ist, |
| 94 | +weshalb diese Datei von Hand geparst werden muss. |
| 95 | + |
| 96 | +Zuerst wird die Datei so geladen, dass jede Zeile für sich verarbeitet werden kann: |
| 97 | + |
| 98 | +``` |
| 99 | +> open people.txt | lines |
| 100 | +───┬────────────────────────────── |
| 101 | + 0 │ Octavia | Butler | Writer |
| 102 | + 1 │ Bob | Ross | Painter |
| 103 | + 2 │ Antonio | Vivaldi | Composer |
| 104 | +───┴────────────────────────────── |
| 105 | +``` |
| 106 | +Dadurch wird bereits wieder eine Tabelle ausgegeben. Im nächsten Schritt sollen die Spalten |
| 107 | +in etwas brauchbares aufgeteilt werden. |
| 108 | +Dafür verwenden wir den [`split`](/book/commands/split.md) Befehl. Wie der Name schon verräht, |
| 109 | +kann damit ein String durch ein Trennzeichen aufgesplittet oder aufgetrennt werden. |
| 110 | +Mit dem `column` Unterbefehl wird der Inhalt über mehrere Spalten aufgeteilt. |
| 111 | +Als Parameter reicht das Trennzeichen, der Rest ist automatisch: |
| 112 | + |
| 113 | +``` |
| 114 | +> open people.txt | lines | split column "|" |
| 115 | +───┬──────────┬───────────┬─────────── |
| 116 | + # │ column1 │ column2 │ column3 |
| 117 | +───┼──────────┼───────────┼─────────── |
| 118 | + 0 │ Octavia │ Butler │ Writer |
| 119 | + 1 │ Bob │ Ross │ Painter |
| 120 | + 2 │ Antonio │ Vivaldi │ Composer |
| 121 | +───┴──────────┴───────────┴─────────── |
| 122 | +``` |
| 123 | + |
| 124 | +Das sieht _fast_ korrekt aus.Es sieht so aus, als ob sich noch eine zusätzliche Lücke eingeschlichen hat. |
| 125 | +Mit dem [`trim`](/book/commands/str_trim.md) Befehl wird dieser beseitigt: |
| 126 | + |
| 127 | +``` |
| 128 | +> open people.txt | lines | split column "|" | str trim |
| 129 | +───┬─────────┬─────────┬────────── |
| 130 | + # │ column1 │ column2 │ column3 |
| 131 | +───┼─────────┼─────────┼────────── |
| 132 | + 0 │ Octavia │ Butler │ Writer |
| 133 | + 1 │ Bob │ Ross │ Painter |
| 134 | + 2 │ Antonio │ Vivaldi │ Composer |
| 135 | +───┴─────────┴─────────┴────────── |
| 136 | +``` |
| 137 | + |
| 138 | + |
| 139 | +Nicht schlecht. Der [`split`](/book/commands/split.md) Befehl gibt nicht nur brauchbare Daten zurück, |
| 140 | +sondern bezeichnet auch noch standardmässig die Spaltennamen: |
| 141 | + |
| 142 | +``` |
| 143 | +> open people.txt | lines | split column "|" | str trim | get column1 |
| 144 | +───┬───────── |
| 145 | + 0 │ Octavia |
| 146 | + 1 │ Bob |
| 147 | + 2 │ Antonio |
| 148 | +───┴───────── |
| 149 | +``` |
| 150 | + |
| 151 | +Die Spalten können jedoch auch benannt werden: |
| 152 | + |
| 153 | +``` |
| 154 | +> open people.txt | lines | split column "|" first_name last_name job | str trim |
| 155 | +───┬────────────┬───────────┬────────── |
| 156 | + # │ first_name │ last_name │ job |
| 157 | +───┼────────────┼───────────┼────────── |
| 158 | + 0 │ Octavia │ Butler │ Writer |
| 159 | + 1 │ Bob │ Ross │ Painter |
| 160 | + 2 │ Antonio │ Vivaldi │ Composer |
| 161 | +───┴────────────┴───────────┴────────── |
| 162 | +``` |
| 163 | + |
| 164 | +Jetzt da die Daten in einer Tabelle sind, können alle Befehle, die wir davor schon auf Tabellen |
| 165 | +angewendet haben wiederverwenden: |
| 166 | + |
| 167 | +``` |
| 168 | +> open people.txt | lines | split column "|" first_name last_name job | str trim | sort-by first_name |
| 169 | +───┬────────────┬───────────┬────────── |
| 170 | + # │ first_name │ last_name │ job |
| 171 | +───┼────────────┼───────────┼────────── |
| 172 | + 0 │ Antonio │ Vivaldi │ Composer |
| 173 | + 1 │ Bob │ Ross │ Painter |
| 174 | + 2 │ Octavia │ Butler │ Writer |
| 175 | +───┴────────────┴───────────┴────────── |
| 176 | +``` |
| 177 | + |
| 178 | +Weitere Befehle, mit denen Texte aus Strings bearbeitet werden können sind: |
| 179 | + |
| 180 | +- `str` |
| 181 | +- [`lines`](/book/commands/lines.md) |
| 182 | +- [`size`](/book/commands/size.md) |
| 183 | + |
| 184 | +Es gibt ausserdem einige Hilfsbefehle, die verwendet werden können um mit Daten umzugehen, |
| 185 | +die Nu eigentlich verstehen sollte. Zum Beispiel wenn eine Rust lock Datei geöffnet wird: |
| 186 | + |
| 187 | +``` |
| 188 | +> open Cargo.lock |
| 189 | +# This file is automatically @generated by Cargo. |
| 190 | +# It is not intended for manual editing. |
| 191 | +[[package]] |
| 192 | +name = "adhoc_derive" |
| 193 | +version = "0.1.2" |
| 194 | +``` |
| 195 | + |
| 196 | +Eine "Cargo.lock" Datei ist eigentlich eine .toml Datei, aber die Dateiendung ist nicht .toml. |
| 197 | +Das ist ok, denn mit dem `from` und seinem Unterbefehl `toml` können wir dies explizit angeben: |
| 198 | + |
| 199 | +``` |
| 200 | +> open Cargo.lock | from toml |
| 201 | +──────────┬─────────────────── |
| 202 | + metadata │ [row 107 columns] |
| 203 | + package │ [table 130 rows] |
| 204 | +──────────┴─────────────────── |
| 205 | +``` |
| 206 | +Der `from` Befehl kann für jedes strukturierte Datenformat, welches Nu versteht, verwendet werden, |
| 207 | +indem das Format als entsprechender Unterbefehl verwendet wird. |
| 208 | + |
| 209 | +## Öffnen im raw Modus |
| 210 | + |
| 211 | +Auch wenn es hilfreich ist, beim Öffnen einer Datei direkt eine Tabelle zu erhalten, |
| 212 | +ist dies nicht immer gewünscht. Um den darunter liegenden Text zu erhalten, kann dem |
| 213 | +[`open`](/book/commands/open.md) Befehl das Flag `--raw` mitgegeben werden: |
| 214 | + |
| 215 | +``` |
| 216 | +> open Cargo.toml --raw |
| 217 | +[package] name = "nu" |
| 218 | +version = "0.1.3" |
| 219 | +authors = ["Yehuda Katz <[email protected]>", "Jonathan Turner <[email protected]>"] |
| 220 | +description = "A shell for the GitHub era" |
| 221 | +license = "MIT" |
| 222 | +``` |
| 223 | + |
| 224 | +## URLs abrufen |
| 225 | + |
| 226 | +Zusätzlich zum Laden von Dateien vom Dateisystem, können auch URLs mit dem [`fetch`](/book/commands/fetch.md) |
| 227 | +Befehl geladen werden. Dies wird den Inhalt der URL aus dem Netz abrufen und zurückgeben: |
| 228 | + |
| 229 | +``` |
| 230 | +> fetch https://blog.rust-lang.org/feed.xml |
| 231 | +──────┬─────────────────── |
| 232 | + feed │ {record 2 fields} |
| 233 | +──────┴─────────────────── |
| 234 | +``` |
0 commit comments