|
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]= 

ストリームにおけるカレントポイントの設定
Read,Skip,Find等の関数は,ストリームに先頭から順に作用する.いずれかの関数が実行されるたびにストリームにおけるカレントポイントが移動される.
ストリームにおけるカレントポイントがどこにあるかを知りたいこと,またこれを再設定したいことがある.ほとんどのコンピュータシステムでは,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]= 
|