IO fertig, trick mit module name in first julia cell
This commit is contained in:
parent
fb58c51aa2
commit
8e83a18cd0
13
.vscode/settings.json
vendored
13
.vscode/settings.json
vendored
@ -1,14 +1,15 @@
|
|||||||
{
|
{
|
||||||
"julia.environmentPath": "/home/hellmund/Julia/23",
|
"julia.environmentPath": "/home/hellmund/Julia/23",
|
||||||
"files.exclude": {
|
"files.exclude": {
|
||||||
"**/.git": true,
|
|
||||||
"**/.svn": true,
|
|
||||||
"**/.hg": true,
|
|
||||||
"**/CVS": true,
|
|
||||||
"**/.DS_Store": true,
|
"**/.DS_Store": true,
|
||||||
"**/Thumbs.db": true,
|
"**/.git": true,
|
||||||
|
"**/.hg": true,
|
||||||
|
"**/.svn": true,
|
||||||
"**/*.ipynb": true,
|
"**/*.ipynb": true,
|
||||||
"**/*.md": true
|
"**/*.md": true,
|
||||||
|
"**/*.quarto_ipynb": true,
|
||||||
|
"**/CVS": true,
|
||||||
|
"**/Thumbs.db": true
|
||||||
},
|
},
|
||||||
"explorerExclude.backup": {},
|
"explorerExclude.backup": {},
|
||||||
"ltex.enabled": false,
|
"ltex.enabled": false,
|
||||||
|
@ -7,6 +7,8 @@ engine: julia
|
|||||||
#| echo: false
|
#| echo: false
|
||||||
#| output: false
|
#| output: false
|
||||||
using InteractiveUtils
|
using InteractiveUtils
|
||||||
|
import QuartoNotebookWorker
|
||||||
|
Base.stdout = QuartoNotebookWorker.with_context(stdout)
|
||||||
```
|
```
|
||||||
|
|
||||||
# Zeichen, Strings und Unicode
|
# Zeichen, Strings und Unicode
|
||||||
@ -140,10 +142,6 @@ Alternativ können Sie die PDF-Version dieser Seite verwenden. Dort sind alle Fo
|
|||||||
|
|
||||||
Eine kleine Hilfsfunktion:
|
Eine kleine Hilfsfunktion:
|
||||||
```{julia}
|
```{julia}
|
||||||
"""
|
|
||||||
printuc(c, n):
|
|
||||||
print n characters from unicode table, starting with character c
|
|
||||||
"""
|
|
||||||
function printuc(c, n)
|
function printuc(c, n)
|
||||||
for i in 0:n-1
|
for i in 0:n-1
|
||||||
print(c + i)
|
print(c + i)
|
||||||
|
@ -2,124 +2,172 @@
|
|||||||
engine: julia
|
engine: julia
|
||||||
---
|
---
|
||||||
|
|
||||||
|
# Ein- und Ausgabe
|
||||||
|
|
||||||
|
|
||||||
```{julia}
|
```{julia}
|
||||||
#| error: false
|
#| error: false
|
||||||
#| echo: false
|
#| echo: false
|
||||||
#| output: false
|
#| output: false
|
||||||
|
|
||||||
|
# https://github.com/JuliaLang/julia/blob/master/base/show.jl#L516-L520
|
||||||
|
# https://github.com/JuliaLang/julia/blob/master/base/show.jl#L3073-L3077
|
||||||
|
|
||||||
|
|
||||||
using InteractiveUtils
|
using InteractiveUtils
|
||||||
|
import QuartoNotebookWorker
|
||||||
|
Base.stdout = QuartoNotebookWorker.with_context(stdout)
|
||||||
|
myactive_module() = Main.Notebook
|
||||||
|
Base.active_module() = myactive_module()
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Ein- und Ausgabe
|
# Ein- und Ausgabe
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
zahlreiche Varianten und Funktionen, das Folgende ist eine kleine Auswahl
|
|
||||||
|
|
||||||
## Konsole
|
## Konsole
|
||||||
|
|
||||||
- OS-abhängig; üblicherweise 3 Kanäle _(streams)_: `stdin, stdout, stderr` (Standardinput, -output, -errorkanal)
|
Das Betriebssystem stellt für ein Programm üblicherweise 3 Kanäle _(streams)_ zur Verfügung:
|
||||||
|
|
||||||
|
- Standardeingabekanal `stdin`
|
||||||
|
- Standardausgabekanal `stdout` und
|
||||||
|
- Standardfehlerausgabekanal `stderr`.
|
||||||
|
|
||||||
|
Wenn das Programm in einem Terminal (oder Konsole bzw. Shell) gestartet wird, kann das Programm über `stdin` die Tastatureingaben
|
||||||
|
einlesen und Ausgaben über `stdout` sowie `stdout` erscheinen im Terminal.
|
||||||
|
|
||||||
|
|
||||||
- Schreiben nach `stdout`: `print()`,`println()`,`printstyled()`
|
- Schreiben nach `stdout`: `print()`,`println()`,`printstyled()`
|
||||||
- Schreiben nach `stderr`: `print(strerr,...)`, `println(stderr,...)`, `printstyled(stderr,...)`
|
- Schreiben nach `stderr`: `print(strerr,...)`, `println(stderr,...)`, `printstyled(stderr,...)`
|
||||||
- Lesen von `stdin`: `readline()`
|
- Lesen von `stdin`: `readline()`
|
||||||
|
|
||||||
### Umwandeln von Strings in andere Typen:
|
|
||||||
|
|
||||||
- `chomp()` entfernt newline
|
|
||||||
- `split()` zerlegt in "Wörter"
|
|
||||||
- `parse()` wandelt in andere Typen um
|
|
||||||
|
|
||||||
### Buffer
|
### Eingaben
|
||||||
|
|
||||||
- `write`-Zugriffe werden gebuffert.
|
Die Sprache _Python_ stellt eine Funktion `input()` zur Verfügung:
|
||||||
|
```{.python}
|
||||||
- `flush(stdout)` leert Buffer
|
ans = input("Bitte eine positive Zahl eingeben!")
|
||||||
|
```
|
||||||
|
Die Funktion gibt den Prompt aus, wartet auf eine Eingabe und liefert die
|
||||||
|
Eingabe als `string` zurück.
|
||||||
|
|
||||||
|
|
||||||
|
In Julia kann man diese Funktion so implementieren:
|
||||||
|
|
||||||
```{julia}
|
```{julia}
|
||||||
|
|
||||||
function input(prompt = "Eingabe:")
|
function input(prompt = "Eingabe:")
|
||||||
println(prompt)
|
println(prompt)
|
||||||
flush(stdout)
|
flush(stdout)
|
||||||
return chomp(readline())
|
return chomp(readline())
|
||||||
end
|
end
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**Anmerkungen**
|
||||||
|
|
||||||
|
- Schreibanweisungen werden von modernen Betriebssystemen gebuffert. Mit `flush(stdout)` wird die Leerung des Buffers und sofortige Schreiboperation erzwungen.
|
||||||
|
- `readline()` liefert einen String zurück, der mit einer Newline `\n` endet. Die Funktion `chomp()` entfernt einen eventuellen Zeilenumbruch vom Ende eines Strings.
|
||||||
|
|
||||||
```{julia}
|
```{julia}
|
||||||
#| eval: false
|
#| eval: false
|
||||||
a = input("Bitte 2 Zahlen eingeben!")
|
a = input("Bitte 2 Zahlen eingeben!")
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
```{julia}
|
```{julia}
|
||||||
#| echo: false
|
#| echo: false
|
||||||
a = "34 56"
|
a = "34 56"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Verarbeitung der Eingabe
|
||||||
|
|
||||||
|
> `split(str)` zerlegt einen String in "Wörter" und liefert einen _(array of strings)_:
|
||||||
|
|
||||||
```{julia}
|
```{julia}
|
||||||
av = split(a)
|
av = split(a)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
```{julia}
|
> `parse(T, str)` versucht, `str` in den Typ `T` umzuwandeln:
|
||||||
parse.(Int, av)
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
```{julia}
|
```{julia}
|
||||||
# Ausgaben auf den Fehlerkanal stderr erscheinen im Jupyter in rot:
|
v = parse.(Int, av)
|
||||||
@warn "Das @warn-Macro schreibt nach stderr."
|
|
||||||
println("Hallo!")
|
|
||||||
println(stderr, "Das sollte nicht passieren!")
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
`parse()` erzeugt einen Fehler, wenn der String sich nicht als Wertangabe von Typ `T` parsen lässt. Man kann den Fehler mit
|
||||||
|
`try/catch` abfangen oder die Funktion `tryparse(T, str)` verwenden, die in so einem Fall `nothing` zurückgibt - worauf man dann
|
||||||
|
z.B. mit `isnothing()` testen kann.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Einzelne Tastenanschläge einlesen
|
### Einzelne Tastenanschläge einlesen
|
||||||
|
|
||||||
- `readline()` u.ä. warten auf den Abschluss der Eingabe durch Drücken der `Enter`-Taste.
|
- `readline()` u.ä. warten auf den Abschluss der Eingabe durch Drücken der `Enter`-Taste.
|
||||||
- Zum Einlesen einzelner _keystrokes_:
|
- Techniken zum Einlesen einzelner _keystrokes_ findet man hier:
|
||||||
|
|
||||||
- [https://stackoverflow.com/questions/56888266/how-to-read-keyboard-inputs-at-every-keystroke-in-julia](https://stackoverflow.com/questions/56888266/how-to-read-keyboard-inputs-at-every-keystroke-in-julia)
|
- [https://stackoverflow.com/questions/56888266/how-to-read-keyboard-inputs-at-every-keystroke-in-julia](https://stackoverflow.com/questions/56888266/how-to-read-keyboard-inputs-at-every-keystroke-in-julia)
|
||||||
- [https://stackoverflow.com/questions/60954235/how-can-i-test-whether-stdin-has-input-available-in-julia](https://stackoverflow.com/questions/60954235/how-can-i-test-whether-stdin-has-input-available-in-julia)
|
- [https://stackoverflow.com/questions/60954235/how-can-i-test-whether-stdin-has-input-available-in-julia](https://stackoverflow.com/questions/60954235/how-can-i-test-whether-stdin-has-input-available-in-julia)
|
||||||
|
|
||||||
|
|
||||||
## Formatierte Ausgabe mit dem `Printf`-Paket
|
|
||||||
|
|
||||||
Die Macros `@sprintf` und `@printf` sind den gleichnamigen C-Funktionen nachempfunden
|
|
||||||
|
|
||||||
- Formatstring: Normaler String mit Platzhaltern
|
## Formatierte Ausgabe mit dem `Printf`-Makro
|
||||||
- Platzhalter haben die Form
|
|
||||||
|
Oft möchte man Zahlen oder Strings mit einer strikten Formatvorgabe - Gesamtlänge, Nachkommastellen, rechts/linksbündig usw - ausgeben.
|
||||||
|
|
||||||
|
Dazu definiert das Paket `Printf` die Makros `@sprintf` und `@printf`, welche sehr ähnlich wie die gleichnamigen C-Funktionen arbeiten.
|
||||||
|
|
||||||
|
```{julia}
|
||||||
|
using Printf
|
||||||
|
|
||||||
|
x = 123.7876355638734
|
||||||
|
|
||||||
|
@printf("Ausgabe rechtsbündig mit max. 10 Zeichen Platz und 3 Nachkommastellen: x= %10.3f", x)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
Das erste Argument ist ein String, der Platzhalter (hier: `%10.3`) für auszugebende Variablen enthält; gefolgt von diesen Variablen als weitere Argumente.
|
||||||
|
|
||||||
|
Platzhalter haben die Form
|
||||||
```
|
```
|
||||||
%[flags][width][.precision]type
|
%[flags][width][.precision]type
|
||||||
```
|
```
|
||||||
(wobei die Angaben in eckigen Klammern alle optional sind)
|
wobei die Angaben in eckigen Klammern alle optional sind.
|
||||||
- Typen:
|
|
||||||
```
|
|
||||||
%s string
|
|
||||||
%i integer
|
|
||||||
%o integer octal (base=8)
|
|
||||||
%x, %X integer hexadecimal (base=16) with digits 0-9abcdef or 0-9ABCDEF, resp.
|
|
||||||
%f floatong point number
|
|
||||||
%e floating point number, scientific representation
|
|
||||||
%g floating point, uses %f or %e depending on value
|
|
||||||
```
|
|
||||||
|
|
||||||
- Flags:
|
**Typangaben im Platzhalter**
|
||||||
```
|
|
||||||
Pluszeichen: rechtsbündig (Standard)
|
| | |
|
||||||
Minuszeichen: linksbündig
|
|:--|:------------|
|
||||||
Null: mit führenden Nullen
|
|`%s`| `string`|
|
||||||
```
|
|`%i`| `integer`|
|
||||||
|
|`%o`| `integer octal (base=8)`|
|
||||||
|
|`%x, %X`| `integer hexadecimal (base=16) with digits 0-9abcdef or 0-9ABCDEF, resp.`|
|
||||||
|
|`%f`| `floating point number`|
|
||||||
|
|`%e`| `floating point number, scientific representation`|
|
||||||
|
|`%g`| `floating point, uses %f or %e depending on value`|
|
||||||
|
|
||||||
|
: {.striped .hover}
|
||||||
|
|
||||||
|
|
||||||
|
**Flags**
|
||||||
|
|
||||||
|
| | |
|
||||||
|
|:----|:-----|
|
||||||
|
|Pluszeichen| rechtsbündig (Standard)|
|
||||||
|
|Minuszeichen| linksbündig|
|
||||||
|
|Null| mit führenden Nullen|
|
||||||
|
|
||||||
|
: {.striped .hover}
|
||||||
|
|
||||||
|
|
||||||
|
**Width**
|
||||||
|
|
||||||
- Width:
|
|
||||||
```
|
```
|
||||||
Anzahl der minimal verwendeten Zeichen (wenn nötig, werden auch mehr genommen)
|
Anzahl der minimal verwendeten Zeichen (wenn nötig, werden auch mehr genommen)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
Zeit für Beispiele:
|
### Beispiele:
|
||||||
|
|
||||||
|
|
||||||
```{julia}
|
```{julia}
|
||||||
@ -130,6 +178,7 @@ using Printf # Paket laden nicht vergessen!
|
|||||||
```{julia}
|
```{julia}
|
||||||
@printf("|%s|", "Hallo") # string mit Platzhalter für String
|
@printf("|%s|", "Hallo") # string mit Platzhalter für String
|
||||||
```
|
```
|
||||||
|
Die senkrechten Striche sind nicht Teil des Platzhalters. Sie sollen die Begrenzung des Ausgabefeldes anzeigen.
|
||||||
|
|
||||||
|
|
||||||
```{julia}
|
```{julia}
|
||||||
@ -144,7 +193,7 @@ using Printf # Paket laden nicht vergessen!
|
|||||||
|
|
||||||
```{julia}
|
```{julia}
|
||||||
@printf("|%3s|", "Hallo") # Längenangabe kann überschritten werden
|
@printf("|%3s|", "Hallo") # Längenangabe kann überschritten werden
|
||||||
# besser eine 'kaputt formatierte' Tabelle als falsche Werte!!
|
# besser eine 'kaputt formatierte' Tabelle als falsche Werte!
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
@ -156,21 +205,21 @@ l = 3342678
|
|||||||
@printf("j= %012i, k= %-12i, l = %12i", j, k, l) # 0-Flag für führende Nullen
|
@printf("j= %012i, k= %-12i, l = %12i", j, k, l) # 0-Flag für führende Nullen
|
||||||
```
|
```
|
||||||
|
|
||||||
`@printf` und `@sprintf` können wie alle Macros wie Funktionen aufgerufen werden:
|
`@printf` und `@sprintf` können wie alle Makros wie Funktionen aufgerufen werden:
|
||||||
|
|
||||||
|
|
||||||
```{julia}
|
```{julia}
|
||||||
@printf("%i %i", 22, j)
|
@printf("%i %i", 22, j)
|
||||||
```
|
```
|
||||||
|
|
||||||
-- oder wie Macros, also ohne Funktionsklammern und ohne Komma:
|
-- oder wie Makros, also ohne Funktionsklammern und ohne Komma:
|
||||||
|
|
||||||
|
|
||||||
```{julia}
|
```{julia}
|
||||||
@printf "%i %i" 22 j
|
@printf "%i %i" 22 j
|
||||||
```
|
```
|
||||||
|
|
||||||
`@printf` kann als erstes Argument noch einen stream übergeben bekommen.
|
`@printf` kann als erstes Argument noch einen Stream übergeben bekommen.
|
||||||
|
|
||||||
Ansonsten besteht die Argumentliste aus
|
Ansonsten besteht die Argumentliste aus
|
||||||
|
|
||||||
@ -183,7 +232,7 @@ Ansonsten besteht die Argumentliste aus
|
|||||||
j, "(geschätzt)" ,k)
|
j, "(geschätzt)" ,k)
|
||||||
```
|
```
|
||||||
|
|
||||||
`@sprintf` druckt nichts, sondern liefert den ausgefüllten formatierten String zurück:
|
Das Makro `@sprintf` druckt nichts, sondern liefert den ausgefüllten formatierten String zurück:
|
||||||
|
|
||||||
|
|
||||||
```{julia}
|
```{julia}
|
||||||
@ -195,12 +244,12 @@ str = @sprintf("x = %10.6f", π );
|
|||||||
str
|
str
|
||||||
```
|
```
|
||||||
|
|
||||||
##### Formatierung der Gleitkommazahlen:
|
### Formatierung der Gleitkommazahlen:
|
||||||
|
|
||||||
Bedeutung des _Precision_-Wertes:
|
Bedeutung des _Precision_-Wertes:
|
||||||
|
|
||||||
- `%f` und `%e`-Format: max. Anzahl der Nachkommastellen
|
- `%f` und `%e`-Format: maximale Anzahl der Nachkommastellen
|
||||||
- `%g`-Format: max. Anzahl von ausgegebenen Ziffern (Vor- + Nachkommastellen)
|
- `%g`-Format: maximale Anzahl von ausgegebenen Ziffern (Vor- + Nachkommastellen)
|
||||||
|
|
||||||
|
|
||||||
```{julia}
|
```{julia}
|
||||||
@ -223,157 +272,153 @@ x = 123456.7890123456
|
|||||||
|
|
||||||
Dateien werden
|
Dateien werden
|
||||||
|
|
||||||
- geöffnet ==> Dabei ensteht ein neues _stream_-Objekt (zusätzlich zu `stdin, stdout, stderr`)
|
- geöffnet $\Longrightarrow$ dabei ensteht ein neues _stream_-Objekt (zusätzlich zu `stdin, stdout, stderr`)
|
||||||
- dann kann dieser _stream_ gelesen und geschrieben werden
|
- dann kann dieser _stream_ gelesen und geschrieben werden
|
||||||
- geschlossen ==> _stream_-Objekt wird von Datei getrennt
|
- geschlossen $\Longrightarrow$ _stream_-Objekt wird von Datei getrennt
|
||||||
|
|
||||||
```
|
```{.julia}
|
||||||
stream = open(path, mode)
|
stream = open(path, mode)
|
||||||
```
|
```
|
||||||
|
|
||||||
- path: Dateiname/pfad
|
- path: Dateiname/pfad
|
||||||
- mode:
|
- mode:
|
||||||
|
|
||||||
```
|
```
|
||||||
"r" read, öffnet am Dateianfang
|
"r" read, öffnet am Dateianfang
|
||||||
"w" write, öffnet am Dateianfang (Datei wird neu angelegt oder überschrieben)
|
"w" write, öffnet am Dateianfang (Datei wird neu angelegt oder überschrieben)
|
||||||
"a" append, öffnet zum Weiterschreiben am Dateiende
|
"a" append, öffnet zum Weiterschreiben am Dateiende
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Schreiben wir mal eine Datei:
|
||||||
|
|
||||||
```{julia}
|
```{julia}
|
||||||
f = open("datei.txt", "w")
|
file = open("datei.txt", "w")
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
```julia
|
|
||||||
@printf(f, "%20i\n", k)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
```{julia}
|
```{julia}
|
||||||
println(f, " zweite Zeile")
|
@printf(file, "%10i\n", k)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
```{julia}
|
```{julia}
|
||||||
close(f)
|
println(file, " zweite Zeile")
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
```{julia}
|
||||||
|
close(file)
|
||||||
|
```
|
||||||
|
|
||||||
|
Schauen wir uns die Datei an:
|
||||||
|
|
||||||
```{julia}
|
```{julia}
|
||||||
;cat datei.txt
|
;cat datei.txt
|
||||||
```
|
```
|
||||||
|
|
||||||
|
...und jetzt öffnen wir sie wieder zum Einlesen:
|
||||||
|
|
||||||
```{julia}
|
```{julia}
|
||||||
f = open("datei.txt", "r")
|
stream = open("datei.txt", "r")
|
||||||
```
|
```
|
||||||
|
|
||||||
|
`readlines(stream)` liefert alle Zeilen einer Textdatei als Vector von Strings.
|
||||||
|
|
||||||
|
`eachline(stream)` liefert einen Iterator über die Zeilen der Datei.
|
||||||
|
|
||||||
|
|
||||||
```{julia}
|
```{julia}
|
||||||
n = 0
|
n = 0
|
||||||
for i in readlines(f) # Lese zeilenweise
|
for line in eachline(stream) # Lese zeilenweise
|
||||||
n += 1
|
n += 1
|
||||||
println(n, i) # Drucke mit Zeilennummer
|
println(n, line) # Drucke mit Zeilennummer
|
||||||
end
|
end
|
||||||
|
close(stream)
|
||||||
```
|
```
|
||||||
|
|
||||||
## Pakete für Dateiformate
|
## Pakete für Dateiformate
|
||||||
|
|
||||||
Pakete für die Ein- und Ausgabe in den verschiedensten Dateiformaten
|
Für die Ein- und Ausgabe in den verschiedensten Dateiformaten existieren Julia-Pakete, z.B.
|
||||||
|
|
||||||
- [PrettyTables.jl](https://ronisbr.github.io/PrettyTables.jl/stable/) Ausgabe von formatierten Tabellen
|
- [PrettyTables.jl](https://ronisbr.github.io/PrettyTables.jl/stable/) Ausgabe von formatierten Tabellen
|
||||||
- [DelimitedFiles.jl](https://docs.julialang.org/en/v1/stdlib/DelimitedFiles/) Ein- und Ausgabe von Matrizen u.ä.
|
- [DelimitedFiles.jl](https://docs.julialang.org/en/v1/stdlib/DelimitedFiles/) Ein- und Ausgabe von Matrizen u.ä.
|
||||||
- [CSV.jl](https://csv.juliadata.org/stable/) Ein- und Ausgabe von Dateien mit "comma-delimited values" u.ä.
|
- [CSV.jl](https://csv.juliadata.org/stable/) Ein- und Ausgabe von Dateien mit "comma-separated values" u.ä.
|
||||||
- [XLSX.jl](https://felipenoris.github.io/XLSX.jl/stable/tutorial/) Ein- und Ausgabe von Excel-Dateien
|
- [XLSX.jl](https://felipenoris.github.io/XLSX.jl/stable/tutorial/) Ein- und Ausgabe von Excel-Dateien
|
||||||
|
|
||||||
und viele andere mehr...
|
und viele andere mehr...
|
||||||
|
|
||||||
### Delimited Files
|
### DelimitedFiles.jl
|
||||||
|
|
||||||
|
|
||||||
|
Dieses Paket ermöglicht das bequeme Abspeichern/Einlesen von Matrizen. Dazu stellt es die Funktionen `writedlm()` und `readdlm()` zur
|
||||||
|
Verfügung.
|
||||||
|
|
||||||
```{julia}
|
```{julia}
|
||||||
using DelimitedFiles
|
using DelimitedFiles
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
Wir erzeugen eine 200×3-Matrix von Zufallszahlen
|
||||||
```{julia}
|
```{julia}
|
||||||
A = rand(200,3)
|
A = rand(200,3)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
und speichern diese
|
||||||
```{julia}
|
```{julia}
|
||||||
f = open("data2.txt", "w")
|
f = open("data2.txt", "w")
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
```{julia}
|
|
||||||
writedlm(f, A)
|
writedlm(f, A)
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
```{julia}
|
|
||||||
close(f)
|
close(f)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
Die geschriebene Datei fängt so an:
|
||||||
|
|
||||||
```{julia}
|
```{julia}
|
||||||
;head data2.txt
|
;head data2.txt
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
Das Wiedereinlesen ist noch einfacher:
|
||||||
```{julia}
|
```{julia}
|
||||||
B = readdlm("data2.txt")
|
B = readdlm("data2.txt")
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
```{julia}
|
Noch ein Punkt: Beim Umgang mit Dateien wird in Julia oft die `do`-Notation verwendet, s. @sec-do.
|
||||||
# man kann open() auch als 1.Argument eine function(iostream) übergeben, die auf den stream
|
Dazu nutzt man, dass `open()` auch Methoden hat, bei denen das 1. Argument eine `function(iostream)` ist.
|
||||||
# angewendet wird, wonach der stream automatisch geschlosssen wird.
|
Diese wird dann auf den _stream_ angewendet und dieser abschliessend automatisch geschlossen. Die `do`-Notation erlaubt es,
|
||||||
#
|
diese Funktion anonym nach dem `do` zu definieren:
|
||||||
# Mit der do-Notation sieht obiger code so aus:
|
|
||||||
|
|
||||||
|
```{julia}
|
||||||
open("data2.txt", "w") do io
|
open("data2.txt", "w") do io
|
||||||
writedlm(io, A)
|
writedlm(io, A)
|
||||||
end
|
end
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### CSV und DataFrames
|
### CSV und DataFrames
|
||||||
|
|
||||||
- [DataFrames.jl](https://dataframes.juliadata.org/stable/) ist ein Paket zum bequemen Umgang mit tabellarischen Daten
|
- Das CSV-Format wird oft benutzt, um Tabellen in einer nicht nur mit MS Excel lesbaren Form zur Verfügung zu stellen.
|
||||||
|
- Ein Beispiel ist die Wetter- und Klimadatenbank _Meteostat_.
|
||||||
|
- Das Paket [DataFrames.jl](https://dataframes.juliadata.org/stable/) stellt Funktionen zum bequemen Umgang mit tabellarischen Daten
|
||||||
|
zur Verfügung.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
```{julia}
|
```{julia}
|
||||||
using CSV, DataFrames, Downloads
|
using CSV, DataFrames, Downloads
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
```{julia}
|
|
||||||
# Wetterdaten von Westerland, s. https://dev.meteostat.net/bulk/hourly.html
|
# Wetterdaten von Westerland, s. https://dev.meteostat.net/bulk/hourly.html
|
||||||
|
|
||||||
|
|
||||||
url = "https://bulk.meteostat.net/v2/hourly/10018.csv.gz"
|
url = "https://bulk.meteostat.net/v2/hourly/10018.csv.gz"
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
```{julia}
|
|
||||||
http_response = Downloads.download(url)
|
http_response = Downloads.download(url)
|
||||||
|
file = CSV.File(http_response, header=false);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
```{julia}
|
Die Daten sehen so aus:
|
||||||
file = CSV.File(http_response, header=false)
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
```{julia}
|
```{julia}
|
||||||
# https://dev.meteostat.net/bulk/hourly.html#endpoints
|
# https://dev.meteostat.net/bulk/hourly.html#endpoints
|
||||||
|
#
|
||||||
# Spalte 1 Datum
|
# Spalte 1 Datum
|
||||||
# 2 Uhrzeit (Stunde)
|
# 2 Uhrzeit (Stunde)
|
||||||
# 3 Temp
|
# 3 Temp
|
||||||
@ -382,25 +427,30 @@ file = CSV.File(http_response, header=false)
|
|||||||
# 8 Windrichtung
|
# 8 Windrichtung
|
||||||
# 9 Windstärke
|
# 9 Windstärke
|
||||||
|
|
||||||
|
|
||||||
df = DataFrame(file)
|
df = DataFrame(file)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
```{julia}
|
```{julia}
|
||||||
|
#| error: false
|
||||||
|
#| echo: false
|
||||||
|
#| output: false
|
||||||
|
#| eval: false
|
||||||
describe(df)
|
describe(df)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Zum bequemen Plotten und zum Umgang mit den Datums- und Zeitformaten in der Wettertabelle
|
||||||
|
laden wir noch 2 Helferlein:
|
||||||
|
|
||||||
```{julia}
|
```{julia}
|
||||||
using StatsPlots
|
using StatsPlots, Dates
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
```{julia}
|
Wir erzeugen eine neue Spalte, die Datum (asu Spalte 1) und Uhrzeit (aus Spalte 2) kombiniert:
|
||||||
using Dates
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
```{julia}
|
```{julia}
|
||||||
# neue Spalte mit Sp.1 und 2 (date & time) kombiniert
|
# neue Spalte mit Sp.1 und 2 (date & time) kombiniert
|
||||||
@ -409,20 +459,24 @@ df[!, :datetime] = DateTime.(df.Column1) .+ Hour.(df.Column2);
|
|||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
```{julia}
|
|
||||||
describe(df)
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
```{julia}
|
```{julia}
|
||||||
|
#| error: false
|
||||||
|
#| echo: false
|
||||||
|
#| output: false
|
||||||
|
#| eval: false
|
||||||
|
|
||||||
@df df plot(:datetime, :Column3)
|
@df df plot(:datetime, :Column3)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Und nun zum Plot:
|
||||||
|
|
||||||
```{julia}
|
```{julia}
|
||||||
@df df plot(:datetime, [:Column9, :Column6, :Column3],
|
@df df plot(:datetime, [:Column9, :Column6, :Column3],
|
||||||
xlims = (DateTime(2022,1,1), DateTime(2022,7,1)),
|
xlims = (DateTime(2023,9,1), DateTime(2024,5,30)),
|
||||||
layout=(3,1), title=["Wind" "Regen" "Temp"], legend=:none)
|
layout=(3,1), title=["Wind" "Regen" "Temp"],
|
||||||
|
legend=:none, size=(800,800))
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
@ -9,6 +9,12 @@ engine: julia
|
|||||||
#| echo: false
|
#| echo: false
|
||||||
#| output: false
|
#| output: false
|
||||||
using InteractiveUtils
|
using InteractiveUtils
|
||||||
|
import QuartoNotebookWorker
|
||||||
|
Base.stdout = QuartoNotebookWorker.with_context(stdout)
|
||||||
|
myactive_module() = Main.Notebook
|
||||||
|
Base.active_module() = myactive_module()
|
||||||
|
# https://github.com/JuliaLang/julia/blob/master/base/show.jl#L516-L520
|
||||||
|
# https://github.com/JuliaLang/julia/blob/master/base/show.jl#L3073-L3077
|
||||||
```
|
```
|
||||||
|
|
||||||
## Dokumentation
|
## Dokumentation
|
||||||
|
@ -7,6 +7,10 @@ engine: julia
|
|||||||
#| echo: false
|
#| echo: false
|
||||||
#| output: false
|
#| output: false
|
||||||
using InteractiveUtils
|
using InteractiveUtils
|
||||||
|
import QuartoNotebookWorker
|
||||||
|
Base.stdout = QuartoNotebookWorker.with_context(stdout)
|
||||||
|
myactive_module() = Main.Notebook
|
||||||
|
Base.active_module() = myactive_module()
|
||||||
```
|
```
|
||||||
|
|
||||||
# Vektoren, Matrizen, Arrays
|
# Vektoren, Matrizen, Arrays
|
||||||
|
@ -2,14 +2,21 @@
|
|||||||
engine: julia
|
engine: julia
|
||||||
---
|
---
|
||||||
|
|
||||||
|
# Funktionen und Operatoren
|
||||||
|
|
||||||
```{julia}
|
```{julia}
|
||||||
#| error: false
|
#| error: false
|
||||||
#| echo: false
|
#| echo: false
|
||||||
#| output: false
|
#| output: false
|
||||||
using InteractiveUtils
|
using InteractiveUtils
|
||||||
|
import QuartoNotebookWorker
|
||||||
|
Base.stdout = QuartoNotebookWorker.with_context(stdout)
|
||||||
|
myactive_module() = Main.Notebook
|
||||||
|
Base.active_module() = myactive_module()
|
||||||
|
# https://github.com/JuliaLang/julia/blob/master/base/show.jl#L516-L520
|
||||||
|
# https://github.com/JuliaLang/julia/blob/master/base/show.jl#L3073-L3077
|
||||||
```
|
```
|
||||||
|
|
||||||
# Funktionen und Operatoren
|
|
||||||
|
|
||||||
Funktionen verarbeiten ihre Argumente zu einem Ergebnis, das sie beim Aufruf zurückliefern.
|
Funktionen verarbeiten ihre Argumente zu einem Ergebnis, das sie beim Aufruf zurückliefern.
|
||||||
|
|
||||||
@ -305,7 +312,7 @@ f(.2)
|
|||||||
["a", "list", "of", "strings"] .|> [length, uppercase, reverse, titlecase]
|
["a", "list", "of", "strings"] .|> [length, uppercase, reverse, titlecase]
|
||||||
```
|
```
|
||||||
|
|
||||||
## Die `do`-Notation
|
## Die `do`-Notation {#sec-do}
|
||||||
|
|
||||||
Eine syntaktische Besonderheit zur Definition anonymer Funktionen als Argumente anderer Funktionen ist die `do`-Notation.
|
Eine syntaktische Besonderheit zur Definition anonymer Funktionen als Argumente anderer Funktionen ist die `do`-Notation.
|
||||||
|
|
||||||
|
@ -2,11 +2,19 @@
|
|||||||
engine: julia
|
engine: julia
|
||||||
---
|
---
|
||||||
|
|
||||||
|
# Ein Fallbeispiel: Der parametrisierte Datentyp PComplex
|
||||||
|
|
||||||
```{julia}
|
```{julia}
|
||||||
#| error: false
|
#| error: false
|
||||||
#| echo: false
|
#| echo: false
|
||||||
#| output: false
|
#| output: false
|
||||||
using InteractiveUtils
|
using InteractiveUtils
|
||||||
|
import QuartoNotebookWorker
|
||||||
|
Base.stdout = QuartoNotebookWorker.with_context(stdout)
|
||||||
|
myactive_module() = Main.Notebook
|
||||||
|
Base.active_module() = myactive_module()
|
||||||
|
# https://github.com/JuliaLang/julia/blob/master/base/show.jl#L516-L520
|
||||||
|
# https://github.com/JuliaLang/julia/blob/master/base/show.jl#L3073-L3077
|
||||||
```
|
```
|
||||||
|
|
||||||
# Ein Fallbeispiel: Der parametrisierte Datentyp PComplex
|
# Ein Fallbeispiel: Der parametrisierte Datentyp PComplex
|
||||||
|
@ -8,6 +8,10 @@ engine: julia
|
|||||||
#| echo: false
|
#| echo: false
|
||||||
#| output: false
|
#| output: false
|
||||||
using InteractiveUtils
|
using InteractiveUtils
|
||||||
|
import QuartoNotebookWorker
|
||||||
|
Base.stdout = QuartoNotebookWorker.with_context(stdout)
|
||||||
|
myactive_module() = Main.Notebook
|
||||||
|
Base.active_module() = myactive_module()
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user