ファイルの検索

FindList["file","text"]ファイルにおいて指定のテキストを含むすべての行のリスト
FindList["file","text",n]ファイルにおいて指定のテキストを含む n 個の行のリスト
FindList["file",{"text1","text2",}] ファイルにおいてテキスト のいずれかを含む行のリスト

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

テキストの書かれたファイル.
テキストを含むすべての行をリストとして返す.
In[2]:=
Click for copyable input
Out[2]=
テキストはファイルのどこにも見出されない.
In[3]:=
Click for copyable input
Out[3]=

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

ピリオドで区切られた「文」で,Andを含むものを探し出す.
In[4]:=
Click for copyable input
Out[4]=
オプション名
デフォルト値
RecordSeparators{"n"}レコードセパレータ
AnchoredSearchFalse検索するテキストはレコードの先頭である
WordSeparators{" ","t"}ワードセパレータ
WordSearchFalse検索するテキストは独立したワードである
IgnoreCaseFalse大文字と小文字を区別しない

FindListのオプション

ファイルの各行の行頭に現れるHereのみを検索する.
In[5]:=
Click for copyable input
Out[5]=

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

ファイルにテキストは現れるが,独立したワードではない.その結果,FindListは何も探し出さない.
In[6]:=
Click for copyable input
Out[6]=
FindList[{"file1","file2",},"text"] テキストを のいずれかにあれば探し出す

複数のファイルの検索

テキストをファイルを対象に2回検索する.
In[7]:=
Click for copyable input
Out[7]=

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

FindList["!command",]外部コマンドを実行し,その出力に含まれるテキストを探し出す

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

外部のUnixコマンドをテキスト型のインターフェースで走らせる.
In[8]:=
Click for copyable input
Out[8]=
上の出力で時刻のフィールドを探し出す.
In[9]:=
Click for copyable input
Out[9]=
OpenRead["file"]ファイルからの入力ストリームを開く
OpenRead["!command"]入力するためにパイプを開く
Find[stream,text]次に現れる text を見出す
Close[stream]ストリームを閉じる

テキストの検索手順

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

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

からの入力ストリームを開く.
In[10]:=
Click for copyable input
Out[10]=
Andを含む初めの行を見出す.
In[11]:=
Click for copyable input
Out[11]=
再びFindを実行すると,Andを含む次の行が見出される.
In[12]:=
Click for copyable input
Out[12]=
入力ストリームを閉じる.
In[13]:=
Click for copyable input
Out[13]=

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

入力ストリームを開く.
In[14]:=
Click for copyable input
Out[14]=
を含む最初の行を見出し,カレントポイントを次の行の先頭に移す.
In[15]:=
Click for copyable input
Out[15]=
Readはその行の先頭の語を読み込む.
In[16]:=
Click for copyable input
Out[16]=
次の3語を飛び越す.
In[17]:=
Click for copyable input
Wolfram言語はを残りのテキスト中に見出し,それを含むレコードを出力として返す.
In[18]:=
Click for copyable input
Out[18]=
入力ストリームを閉じる.
In[19]:=
Click for copyable input
Out[19]=
StreamPosition[stream]開いているストリームにおけるカレントポイントの位置を見出す
SetStreamPosition[stream,n]カレントポイントを設定する
SetStreamPosition[stream,0]カレントポイントをストリームの先頭に設定する
SetStreamPosition[stream,Infinity]カレントポイントをストリームの最後に設定する

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

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

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

ストリームを開く.
In[20]:=
Click for copyable input
Out[20]=
初めにファイルが開かれたとき,カレントポイントは先頭にあり,StreamPositionを返す.
In[21]:=
Click for copyable input
Out[21]=
ファイルの最初の行を読み込む.
In[22]:=
Click for copyable input
Out[22]=
カレントポイントは移動している.
In[23]:=
Click for copyable input
Out[23]=
カレントポイントを少し後退させる.
In[24]:=
Click for copyable input
Out[24]=
Readは初めの行の残りの部分を読み込む.
In[25]:=
Click for copyable input
Out[25]=
ストリームを閉じる.
In[26]:=
Click for copyable input
Out[26]=