Mathematica 9 is now available

Documentation / Mathematica / Mathematicaブック / Mathematicaの仕組み / ファイルとストリーム /

2.12.9 ファイルの検索

特定のテキストを含む行の検索

テキストの書かれたファイル.

In[1]:= !!textfile

"Here is the first line of text.

And the second.

And the third. Here is the end."

テキスト isを含むすべての行をリストとして返す.

In[2]:= FindList["textfile", "is"]

Out[2]=

テキスト fourthはファイルのどこにも見出されない.

In[3]:= FindList["textfile", "fourth"]

Out[3]=

デフォルトで,FindListはファイルの各行を順にスキャンし,指定したテキストを含む行を返す.しかし,一般に,FindListがレコードを順にスキャンし,指定のテキストを含むそれぞれのレコードを返すようにすることもできる.ReadListと同様に,オプション RecordSeparatorsによってレコードセパレータを指定することができる.RecordSeparatorsにペアのリストを与えることによって,左と右のセパレータを別々に指定することもできる.この場合,FindListは左右のセパレータに囲まれたテキストのみを検索するようにできる.

ピリオドで区切られた「文」で, Andを含むものを探し出す.

In[4]:= FindList["textfile", "And", RecordSeparators -> {"."}]

Out[4]=

FindListのオプション

ファイルの各行の行頭に現れる Hereのみを検索する.

In[5]:= FindList["textfile", "Here", AnchoredSearch -> True]

Out[5]=

一般に,FindListはレコードの任意の位置に現れるテキストを探し出す.しかし,オプションWordSearch -> Trueを設定すると,FindListは指定のテキストがレコードの中の独立したワードとして現れるものだけを検索する.オプション WordSeparatorsはワードのセパレータを指定する.

ファイルにテキスト thは現れるが,独立したワードではない.その結果,FindListは何も探し出さない.

In[6]:= FindList["textfile", "th", WordSearch -> True]

Out[6]=

複数のファイルの検索

テキスト thirdをファイル textfileを対象に 2回検索する.

In[7]:= FindList[{"textfile", "textfile"}, "third"]

Out[7]=

FileNames等の関数が返したファイル名のリストに FindListを適用すると便利なことがある.

外部プログラムの出力中のテキストの検索

外部の Unixコマンド dateを走らせる.

In[8]:= !date

Out[8]=

dateの出力の時刻のフィールドを探し 出す.

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

Out[9]=

テキストの検索手順

FindListは,指定するテキストを特定のファイルに対して一括検索する.しかし,時には,テキストを1つずつ順に探し出したいこともある.これは Findを使って実現される.

Findを使うには,まず OpenReadによって明示的に入力ストリームを開かなければならない.その後は,Findをこのストリームに対して実行するたびに指定のテキストが探され,カレントポイントをテキストが見出されたレコードの直後に移す.その結果,Findを数回繰り返して順にテキストを検索することができる.

textfileからの入力ストリームを開く.

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

Out[10]=

Andを含む初めの行を見出す.

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

Out[11]=

再び Findを実行すると,Andを含む次の行が見出される.

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

Out[12]=

入力ストリームを閉じる.

In[13]:= Close[stext]

Out[13]=

一度入力ストリームを開いたら,Find Skip Readを交互に使うことができる.FindListまたは ReadListを実行すると,Mathematicaは即座に入力ストリームの最後まで読み込む.

入力ストリームを開く.

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

Out[14]=

secondを含む最初の行を見出し,カレントポイントを次の行の先頭に移す.

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

Out[15]=

Readはその行の初めのワードを読み込む.

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

Out[16]=

次の 3ワードを飛び越す.

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

Mathematica isを残りのテキスト中に見出し,それを含むレコードを出力として返す.

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

Out[18]=

入力ストリームを閉じる.

In[19]:= Close[stext]

Out[19]=

ストリームにおけるカレントポイントの設定

ReadSkipFind等の関数は,ストリームに先頭から順に作用する.いずれかの関数が実行されるたびにストリームにおけるカレントポイントが移動される.

ストリームにおけるカレントポイントがどこにあるかを知りたいこと,またこれを再設定したいことがある.ほとんどのコンピュータシステムでは,StreamPositionはカレントポイントの位置を,ストリームの先頭からの位置に対応するバイト数を表す整数で返す.

ストリームを開く.

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

Out[20]=

初めにファイルが開かれたとき,カレントポイントは先頭にあり,StreamPosition 0を返す.

In[21]:= StreamPosition[stext]

Out[21]=

ファイルの最初の行を読み込む.

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

Out[22]=

カレントポイントは移動している.

In[23]:= StreamPosition[stext]

Out[23]=

カレントポイントを少し後退させる.

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

Out[24]=

Readは初めの行の残りの部分を読み込む.

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

Out[25]=

ストリームを閉じる.

In[26]:= Close[stext]

Out[26]=



Any questions about topics on this page? Click here to get an individual response.Buy NowMore Information
THIS IS DOCUMENTATION FOR AN OBSOLETE PRODUCT.
SEE THE DOCUMENTATION CENTER FOR THE LATEST INFORMATION.