This is documentation for Mathematica 4, which was
based on an earlier version of the Wolfram Language.
View current documentation (Version 11.2)

 Documentation /  Mathematica /  Das Mathematica Buch /  Die Prinzipien von Mathematica /  Dateien und Ströme /

Lesen von DatenSuchen und Lesen von Zeichenketten

2.11.9 Suchen in Dateien

Suchen nach Zeilen, die spezifizierten Text enthalten

Hier ist eine Datei mit etwas Text.

In[1]:= !!textdatei

Hier ist die erste Textzeile.

Und die zweite.

Und die dritte. Hier ist das Ende.

Dies gibt eine Liste aller Zeilen der Datei zurück, die den Text ist enthalten.

In[2]:= FindList["textdatei", "ist"]

Out[2]=

Der Text vierte erscheint nirgendwo in der Datei.

In[3]:= FindList["textdatei", "vierte"]

Out[3]=

In der Voreinstellung durchsucht FindList aufeinanderfolgende Zeilen einer Datei und gibt die Zeilen zurück, die den spezifizierten Text enthalten. Im allgemeinen kann man jedoch mit FindList auch aufeinanderfolgende Records durchsuchen und vollständige Records zurückerhalten, die spezifizierten Text enthalten. Wie bei ReadList, so kann Mathematica mit der Option RecordSeparators mitgeteilt werden, welche Zeichenketten als Record-Separatoren betrachtet werden sollen. Beachten Sie: Durch Angabe eines Listenpaares als Einstellung für RecordSeparators können Sie unterschiedliche rechte und linke Separatoren festlegen. Dadurch läßt sich erreichen, daß FindList nur nach Text zwischen bestimmten Separatorenpaaren sucht.

So findet man alle „Sätze", die mit einem Punkt enden und Und enthalten.

In[4]:= FindList["textdatei", "Und", RecordSeparators -> {"."}]

Out[4]=

Optionen für FindList

Dies entdeckt Hier lediglich dann, wenn es in der Datei am Anfang einer Zeile steht.

In[5]:= FindList["textdatei", "Hier", AnchoredSearch -> True]

Out[5]=

Im allgemeinen findet FindList einen Text an beliebiger Stelle in einem Record. Durch Setzen der Option WordSearch -> True können Sie jedoch FindList anweisen, daß der gesuchte Text als separates Wort in einem Record erscheinen soll. Die Option WordSeparators spezifiziert die Separatorenliste für Wörter.

Der Text di erscheint in der Datei, jedoch nicht als ein Wort. Folglich hat FindList keinen Erfolg.

In[6]:= FindList["textdatei", "di", WordSearch -> True]

Out[6]=

Suchen in mehreren Dateien

Hier wird in zwei Kopien von textdatei nach dritte gesucht.

In[7]:= FindList[{"textdatei", "textdatei"}, "dritte"]

Out[7]=

Oft ist es nützlich, FindList auf Dateilisten anzuwenden, die mit Funktionen wie etwa FileNames erzeugt wurden.

Finden von Text in der Ausgabe eines externen Programms

Dies startet die externe Unix-Anweisung date.

In[8]:= !date

Out[8]=

So wird aus „date" das Feld Tageszeit bestimmt.

In[9]:= FindList["!date", ":", RecordSeparators -> {" "}]

Out[9]=

Finden von sukzessivem Vorkommen von Text

FindList führt einen Durchlauf durch eine bestimmte Datei durch und sucht dabei nach dem spezifizierten Text. Manchmal will man jedoch inkrementell nach sukzessivem Vorkommen eines Textstückes suchen. Dies wird mit Find möglich.

Um Find benutzen zu können, muß zuerst mit OpenRead explizit ein Eingabestrom geöffnet werden. Dann wird bei jedem Aufruf von Find für diesen Strom nach dem spezifizierten Text gesucht und der Lesezeiger in der Datei an die Stelle gesetzt, die hinter dem gefundenen Record liegt. Folglich kann Find mehrmals aufgerufen werden, um so nacheinander vorkommende Textstücke zu finden.

Dies öffnet einen Eingabestrom für textdatei.

In[10]:= stext = OpenRead["textdatei"]

Out[10]=

So findet man die erste Zeile, die Und enthält.

In[11]:= Find[stext, "Und"]

Out[11]=

Rufen Sie Find erneut auf, so wird die nächste Zeile mit Und ausgegeben.

In[12]:= Find[stext, "Und"]

Out[12]=

Dies schließt den Eingabestrom.

In[13]:= Close[stext]

Out[13]=

Ist ein Eingabestrom einmal geöffnet, können Aufrufe von Find, Skip und Read gemischt werden. Sobald jedoch FindList oder ReadList aufgerufen werden, wird Mathematica sofort bis zum Ende des Eingabestroms lesen.

Dies öffnet den Eingabestrom.

In[14]:= stext = OpenRead["textdatei"]

Out[14]=

So findet man die erste Zeile, die zweite enthält. Der Lesezeiger bleibt in der Datei am Beginn der nächsten Zeile.

In[15]:= Find[stext, "zweite"]

Out[15]=

Read kann dann das Wort lesen, das am Anfang der Zeile steht.

In[16]:= Read[stext, Word]

Out[16]=

So werden die nächsten drei Wörter übersprungen.

In[17]:= Skip[stext, Word, 3]

Mathematica findet ist im restlichen Text und druckt den gesamten Record als Ausgabe.

In[18]:= Find[stext, "ist"]

Out[18]=

So wird der Eingabestrom geschlossen.

In[19]:= Close[stext]

Out[19]=

Finden und Setzen des Lesezeigers in einem Strom

Funktionen wie Read, Skip und Find arbeiten in Strömen normalerweise sequenziell. Jedesmal, wenn eine dieser Funktionen aufgerufen wird, wird der Lesezeiger im Strom weiterbewegt.

Manchmal möchte man eventuell die aktuelle Position des Lesezeigers im Strom erfahren und sie ändern können. Auf den meisten Computersystemen liefert StreamPosition die Position des Lesezeigers als ganze Zahl, die die Anzahl Bytes ab Anfang des Stroms wiedergibt.

Dies öffnet den Strom.

In[20]:= stext = OpenRead["textdatei"]

Out[20]=

Wenn Sie zum erstenmal die Datei öffnen, befindet sich der Lesezeiger am Anfang, und StreamPosition gibt 0 zurück.

In[21]:= StreamPosition[stext]

Out[21]=

So wird die erste Zeile einer Datei gelesen.

In[22]:= Read[stext, Record]

Out[22]=

Der Lesezeiger wurde weitergesetzt.

In[23]:= StreamPosition[stext]

Out[23]=

Dadurch wird die Stromposition zurückgesetzt.

In[24]:= SetStreamPosition[stext, 5]

Out[24]=

Nun gibt Read den Rest der ersten Zeile zurück.

In[25]:= Read[stext, Record]

Out[25]=

Dadurch wird der Strom geschlossen.

In[26]:= Close[stext]

Out[26]=

Lesen von DatenSuchen und Lesen von Zeichenketten