|
2.12.8 原文データの読込み
<<は, ファイルから Mathematicaの式を入力形で読み込む.しかし,ファイルから別のフォーマットで書かれたデータを読み込みたいこともある.例えば,外部のプログラムで生成され,スペースで区切られた数の列からなるデータがあるとする.このようなデータは Mathematicaの入力式としてそのまま読み込むわけにはいかない.関数 ReadListはこのようなデータをファイルまたは入力ストリームから取り込み,Mathematicaのリストに変換する.

ファイルからの数値データの読込み
数値データのファイル.
In[1]:= !!numbers
"11.1 22.2 33.3
44.4 55.5 66.6"
ファイルの中の数値を読み込み,リストにする.
In[2]:= ReadList["numbers", Number]
Out[2]= 

数値データを組にしたリストとしての読込み
2個ずつ組にしてデータを読み込む.
In[3]:= ReadList["numbers", {Number, Number}]
Out[3]= 
ファイルの各行をサブリストとしてデータを読み込む.
In[4]:= ReadList["numbers", Number, RecordLists -> True]
Out[4]= 
ReadListは Fortran形式の 「E」記法の数値を扱うことができる.例えば,2.5E+2は となる.また,ReadListは何桁の精度の数値でも扱うことができる.
Fortran形式の数値を含むファイル.
In[5]:= !!bignum
"4.5E-5 7.8E4
2.5E2 -8.9"
ReadListはこの形式の数値を読むことができる.
In[6]:= ReadList["bignum", Number]
Out[6]= 

さまざまな型のオブジェクトの読込み
ReadListは数値だけでなく,その他さまざまな型のオブジェクトを読むことができる.型のそれぞれは Numberのような記号で指定される.
テキストの書かれたファイル.
In[7]:= !!strings
"Here is text.
And more text."
それぞれの文字を 1つずつ別にして,単一文字のリストとしてファイルを読み込む.
In[8]:= ReadList["strings", Character]
Out[8]= 
それぞれの文字のコードをバイト数で表した数値のリストとしてファイルを読み込む.
In[9]:= ReadList["strings", Byte]
Out[9]= 
上と同様であるが,各行を別のサブリストとする.
In[10]:= ReadList["strings", Byte, RecordLists -> True]
Out[10]= 

読み込むオブジェクトの型指定
ファイル stringsに書かれているワードのリストを返す.
In[11]:= ReadList["strings", Word]
Out[11]= 
ReadListでファイルに書かれたワードを読み込むことができる.このとき,ワードセパレータで区切られた任意の文字列がワードとみなされる.ワードセパレータはオプション WordSeparatorsによって指定することができる.デフォルトではスペースとタブがワードセパレータとなっているが,それ以外の句読点はワードの部分とみなされる.いずれの場合も,複数のワードセパレータが続いて現れても,1つとみなされる.これらのワードセパレータは ReadListが返すワードの部分となることはない.

ReadListのオプション
ファイル stringsのテキストをワードの列として読み込む.文字 eと .をワードセパレータとして指定.
In[12]:= ReadList["strings", Word, WordSeparators -> {"e", "."}]
Out[12]= 
Mathematicaはデータファイルをレコードの列からなるとみなす.デフォルトで,各行はそれぞれ独立したレコードとみなされる.一般に,レコードを区切るレコードセパレータをオプション RecordSeparatorsで指定することができる.レコードセパレータは必ずワードも区切ることに注意する.ワードセパレータと同様,複数のレコードセパレータが続いても,1つが有効で後は無視され る.レコードセパレータがレコードの一部となることはない.
デフォルトで,ファイルの各行は独立のレコードとなる.
In[13]:= ReadList["strings", Record] // InputForm
Out[13]//InputForm= {"Here is text. ", "And more text."}
ピリオドで終る3つの文が書かれたファイル.
In[14]:= !!sentences
"Here is text. And more.
And a second line."
ピリオドの改行をレコードセパレータとしてこのファイルを読み込む.
In[15]:= ReadList["sentences", Record, RecordSeparators -> {".", "\n"}]
Out[15]= 
それぞれの文の中のワードをサブリストとする.
In[16]:= ReadList["sentences", Word, RecordLists -> True, RecordSeparators -> {".", "\n"}]
Out[16]= 

オプション RecordSeparatorsの設定値
テキストが書かれたファイル.
In[17]:= !!source
"f[x] (: function f :)
g[x] (: function g :)"
そのファイル sourceの中のすべてのテキストを読み込み,結果を1つのストリングとして返す.
In[18]:= InputForm[ ReadList["source", Record, RecordSeparators -> { }] ]
Out[18]//InputForm= {"f[x] (: function f :)\ng[x] (: function g :)\n"}
今度はセパレータ(:と :)に囲まれた部分を独立の式としてリストにする.
In[19]:= ReadList["source", Record, RecordSeparators -> {{"(: "}, {" :)"}}]
Out[19]= 
適当なセパレータを選んで,ファイルの特定の部分を選択的に読み込むことができる.
In[20]:= ReadList[ "source", Record, RecordSeparators -> {{"(: function ", "["}, {" :)", "]"}} ]
Out[20]= 
Mathematicaでは普通複数個のセパレータがあっても,それらは1つのセパレータとみなされる.しかし,場合によっては複数個のセパレータがあるとき,セパレータの間には 「なし」のレコードまたはワードがあるとみなしたいことがある.これは NullRecords -> TrueまたはNullWords -> Trueとすることによって実現される.
コロンで区切られたワードを含むファイル.
In[21]:= !!words
"first:second::fourth:::seventh"
複数の連続するコロンは単一のコロンと同一視される.
In[22]:= ReadList["words", Word, WordSeparators -> {":"}]
Out[22]= 
今度は連続するコロンの間は 「なし」のワードとみなされる.
In[23]:= ReadList["words", Word, WordSeparators -> {":"}, NullWords -> True]
Out[23]= 
ほとんどの場合,ワードはそれ自体ワードとみなされないセパレータによって区切られる.しかし,場合によっては,特殊なそれ自体ワードである「トークンワード」によってワードを区切ることが便利なこともある.トークンワードはリストとしてオプション TokenWordsに設定すればよい.
テキストが書かれたファイル.
In[24]:= !!language
"22*a*b+56*c+13*a*d"
指定したトークンワードを区切りとしてテキストをワード単位で読み込む.
In[25]:= ReadList["language", Word, TokenWords -> {"+", "*"}]
Out[25]= 
ReadListを使ってファイルから Mathematica式を読むことができる.一般に,それぞれの式はたとえ複数行に渡るものでも,最後は改行で終らなければならない.
Mathematica入力式として使うことができるテキストの書かれたファイル.
In[26]:= !!exprs
"x + y +
z
2^8"
exprsの中のテキストを Mathematicaの式として読み込む.
In[27]:= ReadList["exprs", Expression]
Out[27]= 
読み込まれた式が評価されるのを抑制する.
In[28]:= ReadList["exprs", Hold[Expression]]
Out[28]= 
ReadListはそれが読み込む Mathematica式に任意のオブジェクトを挿入することができる.ReadListの第 2引数は,読み込むオブジェクトの型を指定する Numberや Word等の記号を含む任意の式からなる.したがって,例えば,ReadList["file", Number, Number ]は,読み込んだ数を 2 つずつサブリストにする.同様に,ReadList["file", Hold[Expression]]は,読み込んだ式を Holdの中に入れる.
ReadListが, 所定のオブジェクトの1組を読み終る前にファイルの最後に達したときは,読み込まれていないオブジェクトの代りに特別な記号 EndOfFileを挿入する.
数の書かれたファイル.
In[29]:= !!numbers
"11.1 22.2 33.3
44.4 55.5 66.6"
ファイルの最後に来ても必要な数が足りないとき,その位置に記号 EndOfFileが現れる.
In[30]:= ReadList["numbers", {Number, Number, Number, Number}]
Out[30]= 

コマンドとストリームからの読込み
Unixコマンド dateを実行し,その出力を文字列として読み込む.
In[31]:= ReadList["!date", String]
Out[31]= 

入力ストリームからの読込みに関する関数
ReadListは所定のファイルまたは入力ストリームのすべてのデータを一度に読み込む.しかし,時には,例えば次のデータが何かを予測しながら,1つずつ順にデータを取り込みたいことがある.
ファイルから個々のデータを読むとき,Mathematicaはファイルにおけるカレントポイント(現在地)を覚えている.OpenReadを実行すると,Mathematicaはファイルからの入力ストリームを開き,カレントポイントをファイルの先頭に置く.Readでファイルからオブジェクトを読み込むたびに,Mathematicaはカレントポイントを読み込んだオブジェクトの直後へ移動する.Skipを使えば,オブジェクトを読み込まずに複数のオブジェクトを飛び越してカレントポイントを移動することができる.
数の書かれたファイル.
In[32]:= !!numbers
"11.1 22.2 33.3
44.4 55.5 66.6"
ファイルからの入力ストリームを開く.
In[33]:= snum = OpenRead["numbers"]
Out[33]= 
ファイルから初めの数を読み込む.
In[34]:= Read[snum, Number]
Out[34]= 
次の 2つの数をペアにして読み込む.
In[35]:= Read[snum, {Number, Number}]
Out[35]= 
次の数を読まずに飛び越す.
In[36]:= Skip[snum, Number]
残りの数を読み込む.
In[37]:= ReadList[snum, Number]
Out[37]= 
入力ストリームを閉じる.
In[38]:= Close[snum]
Out[38]= 
ReadListのときと同様,Readや Skipにおいてもオプション WordSeparatorsと RecordSeparatorsを使うことができる.
ファイルの最後より先を読み込もうとすると, Readは記号 EndOfFileを返すことに注意する.
|