Textsuche in einer Datei - flutter-tutorial-de/dart-programming GitHub Wiki

Table of Contents

Zielsetzung

Unser erstes Projekt ist eine einfache Textsuche in einer Datei.

Dabei lernen wir sukzessive, welche Schritte notwendig sind, um ein selbständiges Programm mit Hilfe der Entwicklungsumgebung IdeaIC zu erstellen.

Kenntnisse

  • Projekt erstellen
  • Dart:
    • Programmargument auswerten
    • Datei lesen
    • Suche nach regulärem Ausdruck

Projekt erstellen

  • IdeaIC starten
  • Menü: File - New -
  • Linke Spalte: Dart
  • Dart-SDK:
    • Windows: c:\dart-sdk
    • Linux: ~/dart-sdk
  • Es erscheint eine Listbox, dort Console-Application a command-line application sample anklicken.
  • Next-Button
  • Project name: dsuche
  • Project loction:
    • Linux: ~/dev/dsuche
    • Windows: c:\dev\dsuche
  • Finish-Button
Damit ist das Projekt names dsuche erstellt.

Projekt erkunden

  • Linke Spalte: Projects anklicken.
  • Es wird ein Ordner namens dsuche sichtbar.
  • Auf das Symbol ">" klicken, daraufhin klappt das Verzeichnis aus.
  • Im Unterverzeichnis bin liegt die Datei mit dem Hauptprogramm dsuche.dart.
  • Im Unterverzeichnis lib liegt eine zweite Datei dsuche.dart, die ergänzenden Code enthält. Da wir diese Datei in diesem Projekt nicht brauchen, löschen wir diese: Rechte Maustaste - Delete.
  • Ziemlich weit unten im Verzeichnis gibt es die Datei pubspec.yaml. Dort werden Pakete eingetragen. In diesem Projekt brauchen wir nichts zusätzliches, daher bleibt die Datei in diesem Fall unverändert.

Programmcode in dsuche.dart

  • Links in der Projektansicht die Datei bin\dsuche.dart anklicken.
  • Nun kopieren wir folgenden Code in diese Datei:
import 'dart:io';
/// Durchsuchen einer Datei nach einem regulären Ausdruck.
/// [args]: Programm-Argumente, z. B. [r'https?://', 'rechnung.txt']
void main(List<String> args) {
  if (args.length < 2){
    print('Gebrauch: dsuche <suchmuster> <date>\nBeispiel: dsuche "https?://" rechnung.txt');
  } else {
    final lines = File(args[1]).readAsLinesSync();
    RegExp regExp = RegExp(args[0], caseSensitive: false);
    for (var line in lines){
      if (regExp.firstMatch(line) != null){
        print(line);
      }
    }
  }
}
  • import 'dart:io'; Wir verwenden eine Bibliothek, näheres folgt im nachfolgenden Kapitel.
  • void main(List<String> args). Hier unterscheidet sich die Funktion main() von früheren Beispielen:
    • Es wird eine Liste von Strings im Parameter args übergeben.
    • Das sind die sogenannten Programmparameter: Wird das Programm in der Eingabeaufforderung aufgerufen, kann man diesem zusätzliche Informationen mitgeben. In unserem Fall, welcher Text gesucht wird und in welcher Datei. Diese Informationen werden in den Parameter args übergeben.
  • args.length < 2 Wir prüfen, ob weniger als zwei Parameter angegeben wurden. Wenn ja, geben wir eine Fehlermeldung aus und das Programm ist fertig.
  • final lines = File(args[1]).readAsLinesSync(); Wir benutzen die Bibliothek dart:io zum Einlesen der Datei:
    • File(args[1])erstellt ein Objekt der Klasse File, das mit dem zweiten Argument spezifiziert wird.
    • Hinweis: das erste Argument ist args[0].
    • Die Methode readAsLinesSync() der Klasse File liest den Inhalt der Datei und liefert die einzelnen Zeilen in einer Liste von Strings ab, die bei uns in der Variablen lines gespeichert wird.
  • RegExp regExp = RegExp(args[0], caseSensitive: false) Aus dem ersten Programmargument args[0] erzeugen wir ein Objekt der Klasse RegExp, mit der Option caseSensitive false, d. h. Groß-/Kleinschreibung ist bei der Stringsuche egal.
  • for (var line in lines) Mit dieser Schleife verarbeiten wir Zeile für Zeile, die jeweils in der Variable line zur Verfügung steht.
  • regExp.firstMatch(line) != null Wir prüfen, ob der Suchstring im Objekt regExpr in der Zeile line vorkommt: Wenn ja, wird die Zeile ausgegeben.

Programm in der Entwicklungsumgebung starten

  • Menü Run - Edit configuration klicken.
  • Es geht eine Dialogbox auf: Oben links auf das + klicken.
  • In der Liste Dart Command Line App
  • Name: dsuche
  • Dart file: Hier auf das Ordnersymbol in dem Textfeld klicken, dort Ordner dsuche aufklappen, im Unterordner bin die Datei dsuche.dart anklicken.
  • Program arguments:
    • Windows: https?:// c:\dev\links.txt
    • Linux: https?:// ~/dev/links.txt
  • Button Ok
  • Im Entwicklungsordner (Windows: c:\dev, Linux: ~/dev/) eine Datei links.html anlegen:
Dies ist eine Testdatei
Suchen geht mit https://google.com
Spezialwissen findet sich auf http://wikipedia.de
Hab Spaß mit Programmieren!
  • Programm laufen lassen: In der oberen Toolbar gibt es einen grünen Pfeil rechts (grünes Dreick): Anklicken
  • Das Programm wird ausgeführt.
  • Im unteren Bereich gibt es folgende Ausgabe:
dart dsuche.dart https?:// ...
Suchen geht mit https://google.com
Spezialwissen findet sich auf http://wikipedia.de

Process finished with exit code 0
  • Unser Programm gibt also wie gewünscht von den vier vorhandenen Zeilen in links.txt genau die zwei aus, die einen Link (http:// oder https://) enthalten!

Programm compilieren

Linux

  • Terminal öffnen
gdev dsuche
dcompile dsuche
</code>
Danach gibt es die Datei <code>/usr/local/bin/dsuche</code>.
Dieses Programm kann in der Eingabeaufforderung gestartet werden.
<pre>gdev
dsuche https?:// links.txt

Windows

  • Eingabeaufforderung starten
  • gdev dsuche
  • dcompile dsuche
Danach gibt es die Datei c:\dev\bin\dsuche.exe Dieses Programm kann in der Eingabeaufforderung gestartet werden.
gdev
dsuche https?:// links.txt

Fazit

Mit 16 Zeilen Dart-Code wurde ein nützliches Programm erstellt, das mit dem Windows-Programm find konkurrieren kann. Mehr noch, es findet einen regulären Ausdruck, was viel mächtiger ist als die primitive Stringsuche von find!

Aufgabe

Modifiziere den Programmcode in der Weise, dass bei "gefundenen Zeilen" am Anfang die Zeilennummer vorangestellt wird. In unserem Beispiel soll also die Ausgabe wie folgt aussehen:

2: Suchen geht mit https://google.com
3: Spezialwissen findet sich auf http://wikipedia.de
⚠️ **GitHub.com Fallback** ⚠️