ドキュメンテーション センター

  • 評価版
  • 製品アップデート

目次

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

textscan

テキスト ファイルまたは文字列から書式付きデータを読み取る

構文

  • C = textscan(fileID,formatSpec)
  • C = textscan(fileID,formatSpec,N)
  • C = textscan(str,formatSpec)
  • C = textscan(str,formatSpec,N)
  • C = textscan(___,Name,Value)
  • [C,position] = textscan(___)

説明

C = textscan(fileID,formatSpec) は開いたテキスト ファイルからデータをセル配列 C に読み取ります。テキスト ファイルはファイル識別子 fileID で示されます。fopen を使用すると、このファイルを開いて fileID 値を取得できます。ファイルから読み取った後、fclose(fileID) を呼び出してファイルを閉じます。

textscan は、ファイル内のデータを変換指定子の文字列 formatSpec と一致させようとします。

C = textscan(fileID,formatSpec,N) は、formatSpecN 回使用して、データを読み取ります。ここで N は正の整数です。N 回反復した後でファイルから追加のデータを読み取るには、元の fileID を使用して textscan を再度呼び出します。同じファイル識別子 (fileID) で関数 textscan を呼び出してファイルのテキスト スキャンを再開すると、textscan は、最後の読み取りを終了したポイントから自動的に読み取りを再開します。

C = textscan(str,formatSpec) は文字列 str からデータを読み取り、セル配列 C に格納します。文字列の場合は、textscan を繰り返し呼び出すと、毎回始めからスキャンが再開されます。前回の位置からスキャンを再開するには、position 出力を要求します。

textscan は、文字列 str 内のデータを変換指定子の文字列 formatSpec と一致させようとします。

C = textscan(str,formatSpec,N) は、formatSpecN 回使用して、文字列データを読み取ります。ここで N は正の整数です。

C = textscan(___,Name,Value) は、前の構文の入力引数のいずれかに加え、1 つまたは複数の Name,Value のペアの引数を使用して、オプションを指定します。

[C,position] = textscan(___) は、上記の構文のいずれかの入力引数を使用して、ファイルまたは文字列の位置を 2 番目の出力引数としてスキャンの終了時に返します。ファイルの場合、これは textscan を呼び出した後で ftell(fileID) から返される値です。文字列の場合、position は、関数 textscan により読み込まれた文字数を示します。

すべて展開する

文字列の読み取り

浮動小数点数の文字列を読み取ります。

str = '0.41 8.24 3.57 6.24 9.27';

C = textscan(str,'%f');

formatSpec 文字列 '%f' は、textscanstr 内の各フィールドを倍精度浮動小数点と一致させるよう指示します。

セル配列 C の内容を表示します。

celldisp(C)
C{1} =
 
    0.4100
    8.2400
    3.5700
    6.2400
    9.2700

同じ文字列を読み取り、各値を 10 進数の 1 桁に切り捨てます。

C = textscan(str,'%3.1f %*1d');

指定子 %3.1f は、フィールド幅が 3 桁で精度が 1 であることを示します。関数 textscan は、小数点および小数点以下 1 桁を含めた合計 3 桁を読み取ります。指定子 %*1d により、残りの桁をスキップすることを textscan に指示されます。

セル配列 C の内容を表示します。

celldisp(C)
C{1} =
 
    0.4000
    8.2000
    3.5000
    6.2000
    9.2000

異なるタイプのデータの読み取り

テキスト エディターを使用して、次の形式でデータを含むファイル scan1.dat を作成します。

09/12/2005 Level1 12.34 45 1.23e10 inf Nan Yes 5.1+3i
10/12/2005 Level2 23.54 60 9e19 -inf  0.001 No 2.2-.5i
11/12/2005 Level3 34.90 12 2e5   10  100   No 3.1+.1i

ファイルを開き、各列を適切な変換指定子で読み取ります。

fileID = fopen('scan1.dat');
C = textscan(fileID,'%s %s %f32 %d8 %u %f %f %s %f');
fclose(fileID);
celldisp(C)
C{1}{1} =
 
09/12/2005
 
 
C{1}{2} =
 
10/12/2005
 
 
C{1}{3} =
 
11/12/2005
 
 
C{2}{1} =
 
Level1
 
 
C{2}{2} =
 
Level2
 
 
C{2}{3} =
 
Level3
 
 
C{3} =
 
   12.3400
   23.5400
   34.9000

 
 
C{4} =
 
   45
   60
   12

 
 
C{5} =
 
  4294967295
  4294967295
      200000

 
 
C{6} =
 
   Inf
  -Inf
    10

 
 
C{7} =
 
       NaN
    0.0010
  100.0000

 
 
C{8}{1} =
 
Yes
 
 
C{8}{2} =
 
No
 
 
C{8}{3} =
 
No
 
 
C{9} =
 
   5.1000 + 3.0000i
   2.2000 - 0.5000i
   3.1000 + 0.1000i

関数 textscan は、1 行 9 列のセル配列 C を返します。

C 内の各セルの MATLAB® データ型を表示します。

C
C = 

  Columns 1 through 5

    {3x1 cell}    {3x1 cell}    [3x1 single]    [3x1 int8]    [3x1 uint32]

  Columns 6 through 9

    [3x1 double]    [3x1 double]    {3x1 cell}    [3x1 double]

たとえば、C{1}C{2} はセル配列です。C{5} はデータ型 uint32 であるため、C{5} のはじめの 2 要素は、32 ビット符号なし整数の最大値または intmax('uint32') です。

リテラル文字列の除去

前の例のデータの 2 列目にある各フィールドから、テキスト 'Level' を除去します。

formatSpec 入力のリテラル文字列を一致させます。

fileID = fopen('scan1.dat');
C = textscan(fileID,'%s Level%d %f32 %d8 %u %f %f %s %f');
fclose(fileID);
C{2}
ans =

           1
           2
           3

C 内の 2 番目のセルの MATLAB データ型を表示します。

class(C{2})
ans =

int32

1 行 9 列のセル配列 C の 2 番目のセルは、データ型が int32 になります。

行の残りをスキップする

前の例のファイル内にある最初の列をセル配列に読み取り、残りの部分をスキップします。

fileID = fopen('scan1.dat');
dates = textscan(fileID,'%s %*[^\n]');
fclose(fileID);
dates{1}
ans = 

    '09/12/2005'
    '10/12/2005'
    '11/12/2005'

関数 textscan は、1 行 1 列のセル配列 dates を返します。

区切り記号と空値の変換の指定

テキスト エディターを使用して、コンマ区切りファイル data.csv を作成します。

1,  2,  3,  4,   ,  6
7,  8,  9,   , 11, 12

ファイルを読み取り、空のセルを -Inf に変換します。

fileID = fopen('data.csv');
C = textscan(fileID,'%f %f %f %f %u8 %f',...
'delimiter',',','EmptyValue',-Inf);
fclose(fileID);
column4 = C{4}, column5 = C{5}
column4 =

     4
  -Inf


column5 =

    0
   11

関数 textscan は、1 行 6 列のセル配列 C を返します。関数 textscan は、C{4} の空の値を -Inf に変換します。ここで C{4} は浮動小数点形式に関連付けられています。MATLAB は符号なし整数 -Inf0 と表示するため、関数 textscanC{5} 内の空の値を -Inf ではなく 0 に変換します。

カスタムの空値の文字列とコメントの読み取り

テキスト エディターを使用して、次の行を含むコンマ区切りのファイル data2.csv を作成します。

abc, 2, NA, 3, 4
// Comment Here
def, na, 5, 6, 7

textscan がコメントまたは空の値として扱う入力を指定します。

fileID = fopen('data2.csv');
C = textscan(fileID,'%s %n %n %n %n','delimiter',',',...
'treatAsEmpty',{'NA','na'},'commentStyle','//');
fclose(fileID);
celldisp(C)
C{1}{1} =
abc

C{1}{2} =
def

C{2} =
     2
   NaN

C{3} =
   NaN
     5

C{4} =
     3
     6

C{5} =
     4
     7

区切り記号の繰り返しを 1 つのものとして処理する

テキスト エディターを使用して、次の内容を含むファイル data3.csv を作成します。

1,2,3,,4
5,6,7,,8

連続するコンマを 1 つの区切り記号として扱うには、MultipleDelimsAsOne パラメーターを使用して値を 1 (true) に設定します。

fileID = fopen('data3.csv');
C = textscan(fileID,'%f %f %f %f','delimiter',',',...
'MultipleDelimsAsOne',1);
fclose(fileID);
celldisp(C)
C{1} =
     1
     5

C{2} =
     2
     6

C{3} =
     3
     7

C{4} =
     4
     8

数値データの収集

テキスト エディターを使用して、次の内容を含むファイル grades.txt を作成します。

Student_ID  | Test1  | Test2  | Test3
   1           91.5     89.2     77.3
   2           88.0     67.8     91.0
   3           76.3     78.1     92.5
   4           96.4     81.2     84.6

形式 '%s' を使用した列ヘッダーを 4 回読み取ります。

fileID = fopen('grades.txt');

formatSpec = '%s';
N = 4;
C_text = textscan(fileID,formatSpec,N,'delimiter','|');

ファイルから数値データを読み取ります。

C_data0 = textscan(fileID,'%d %f %f %f')
C_data0 = 
  [4x1 int32]    [4x1 double]    [4x1 double]    [4x1 double]

CollectOutput の既定値は 0 (false) であるため、関数 textscan は数値データの各列を個別の配列に返します。

同じクラスの連続する列が 1 つの配列に収集されるように、CollectOutput1 (true) に設定します。

frewind(fileID);

C_text = textscan(fileID,'%s',N,'delimiter','|');

C_data1 = textscan(fileID,'%d %f %f %f','CollectOutput',1)
C_data1 = 
    [4x1 int32]    [4x3 double]

すべて double のテスト スコアが 1 つの 4 行 3 列の配列に収集さされます。

ファイル grades.txt を閉じます。

fclose(fileID);

既定以外の制御文字の読み取り

関数 sprintf を使用して、データ内にある既定でないエスケープ シーケンスを変換します。

フォーム フィード文字 \f を含む文字列を作成します。その後、関数 textscan を使用して文字列を読み取るため、関数 sprintf を呼び出してフォーム フィードを明示的に変換します。

lyric = sprintf('Blackbird\fsinging\fin\fthe\fdead\fof\fnight');
C = textscan(lyric,'%s','delimiter',sprintf('\f'));
C{1}
ans = 

    'Blackbird'
    'singing'
    'in'
    'the'
    'dead'
    'of'
    'night'

関数 textscan は、1 行 1 列のセル配列 C を返します。

文字列のテキスト スキャンの再開

先頭以外の位置から文字列のスキャンを再開します。

文字列のテキスト スキャンを再開する場合、textscan は毎回文字列の始めから読み取ります。文字列の他の場所からスキャンを再開するには、関数 textscan の初期の呼び出しに、2 つの出力引数の構文を使用します。

たとえば、lyric という文字列を作成します。文字列の最初の語を読み取った後、スキャンを再開します。

lyric = 'Blackbird singing in the dead of night';
[firstword,pos] = textscan(lyric,'%9c',1);
lastpart = textscan(lyric(pos+1:end),'%s');

入力引数

すべて展開する

fileID - ファイル識別子数値スカラー

開いたテキスト ファイルのファイル識別子は、数値として指定します。textscan でファイルを読み取る前に、fopen を使用してファイルを開き、fileID を取得しなければなりません。

データ型:double

formatSpec - データ フィールドの形式文字列

データ フィールドの形式は、1 つまたは複数の変換指定子の文字列として指定します。関数 textscan はファイルまたは文字列を読み取るときに、データを formatSpec 文字列に一致させようとします。関数 textscan がデータ フィールドの一致に失敗した場合は、読み取りを中断し、中断する前に読み取ったすべてのフィールドを返します。

変換指定子の数は、出力配列 C 内のセル数を決めます。

数値フィールド

この表は、数値入力用に使用可能な変換指定子をまとめたものです。

数値入力タイプ変換指定子出力クラス
整数、符号付き%dint32
%d8int8
%d16int16
%d32int32
%d64int64
整数、符号なし%uuint32
%u8uint8
%u16uint16
%u32uint32
%u64uint64
浮動小数点数%fdouble
%f32single
%f64double
%ndouble

文字フィールド

この表は、文字入力用に使用可能な変換指定子をまとめたものです。

文字列変換指定子詳細
文字%s文字列
%q文字列。二重引用符は、一まとめにするテキストを示します。
%c区切り記号を含む 1 つの文字
パターン マッチング文字列%[...]

一致しない最初の文字に到達するまで、かっこ内の文字のみを読み取ります。セットに ] を含めるには、それを最初に指定します。%[]...].

例: %[mus] は、'summer ''summ' として読み込みます。

%[^...]

一致する最初の文字に到達するまで、かっこ内の文字を除外します。] から除外するには、それを最初に指定します。%[^]...].

例: %[^xrg] は、'summer ''summe' として読み込みます。

オプションの演算子

formatSpec 内の変換指定子は、オプションの演算子を含めることができます。これらの演算子は次の順序で表示されます (明確にするためにスペースも含む)。

オプションの演算子としては、次のものが挙げられます。

  • 無視するフィールドと文字

    textscan は、特定のフィールドまたはフィールドの一部を無視するように指示していない限り、ファイルのすべての文字を順番に読み取ります。

    フィールドの一部をスキップするか読み取るかするには、次の演算子を使用します。

    演算子

    動作

    %*

    フィールドをスキップします。関数 textscan は、スキップしたフィールドの出力セルを作成しません。

    例: '%s %*s %s %s %*s %*s %s' (スペースはオプション) は、文字列
    'Blackbird singing in the dead of night' を、文字列
    'Blackbird' 'in' 'the' 'night' の 4 つの出力セルに変換します。

    %*n

    フィールドの n 文字を無視します。ここで、n はフィールド内の文字数以下の整数です。

    例: %*4s は 4 文字を無視するため、'%*4s %s''summer''er' として読み取ります。

  • フィールド幅

    textscan は、フィールド幅または精度で指定された文字数または桁数、あるいは最初の区切り記号までの、どちらか先に出現した方を読み取ります。小数点は桁と見なされます変換指定子内のパーセント文字 (%) の後に数値を挿入して、フィールド幅を指定します。

    例:%5f'123.456'123.4 として読み取ります。

      メモ:   フィールド幅演算子を1 つの文字と組み合わせて %c のように使用すると、textscan は区切り記号も読み取ります。
      例: %7c と指定すると空白を含む 7 文字が読み取られます。よって、'Day and night''Day and' として読み取られます。

  • 精度

    浮動小数点数 (%n%f%f32%f64) の場合、読み取る小数点の桁数を指定することができます。

    例:%7.2f'123.456'123.45 として読み取ります。

  • 無視するリテラル テキスト

    textscan は文字列 formatSpec に追加された指定のテキストを無視します。

    例:Level%u8'Level1'1 として読み込みます。

    例:%u8Step'2Step'2 として読み込みます。

N - formatSpec の適用回数整数

formatSpec の適用回数は整数として指定します。

データ型:single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

str - 入力文字列文字列

読み取る入力文字列。

名前/値のペアの引数

オプションの Name,Value 引数のペアをコンマ区切りで指定します。ここで、Name は引数名で、Value は対応する値です。Name は単一引用符 (' ') で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を任意の順番で指定できます。

例: C = textscan(fileID,formatSpec,'HeaderLines',3,'Delimiter',',') はデータの最初の 3 行をスキップし、コンマを区切り文字として扱い、残りのデータを読み取ります。

名前は大文字と小文字が区別されません。

'CollectOutput' - データ連結を決定する論理インジケーターfalse (既定の設定) | true

データ連結を決定する論理インジケーターは、'CollectOutput' と、true または false とで構成されるコンマ区切りペアとして指定します。true の場合、textscan は同じ基本 MATLAB クラスの連続する出力セルを 1 つの配列に連結します。

'CommentStyle' - 無視するテキストを示す記号文字列 | 文字列のセル配列

無視するテキストを示す記号は、'CommentStyle'、文字列または文字列のセル配列で構成されるコンマ区切りのペアとして指定します。

同じ行の文字列に続く文字を無視するには、1 つの文字列 ('%' など) を指定します。文字列間の文字を無視するには、2 つの文字列のセル配列 ({'/*', '*/'} など) を指定します。

textscan は、各フィールドの最初にだけコメントをチェックします (フィールド内はコメント チェック対象外です)。

例: 'CommentStyle',{'/*', '*/'}

'Delimiter' - フィールドの区切り記号{'','\b','\t'} (既定の設定) | 文字列 | 文字列のセル配列

フィールドの区切り記号は、'Delimiter' と文字列または文字列のセル配列で構成されるコンマ区切りのペアとして指定します。文字列のセル配列に含まれる複数の区切り記号を指定します。

例: 'delimiter',{';','*'}

関数 textscan は連続する区切り文字を個別の区切り記号として解釈し、出力セルに空の値を返します。

データの各行に含まれる既定のフィールド区切り記号は空白です。空白には、スペース (' ')、バックスペース ('\b')、またはタブ ('\t') 文字を組み合わせて使用することができます。区切り記号を指定しないと、関数 textscan は連続する空白文字を 1 つの区切り記号と解釈します。

次のエスケープ シーケンスの 1 つを区切り記号として指定した場合、関数 textscan は、シーケンスを対応する制御文字に変換します。

\bバックスペース
\n改行
\rキャリッジ リターン
\tタブ
\\バックスラッシュ (\)

'EmptyValue' - 空の数値フィールドに返す値NaN (既定の設定) | スカラー

区切り付きテキスト ファイルの空の数値フィールドに返す値は、'EmptyValue' およびスカラーで構成されるコンマ区切りペアとして指定します。

'EndOfLine' - 行末の文字文字列

行末の文字は、'EndOfLine' と文字列で構成されるコンマ区切りのペアとして指定します。既定の行末シーケンスはファイルの形式に依存し、改行文字 ('\n')、キャリッジ リターン ('\r')、またはこれらの組み合わせ ('\r\n') を含めることができます。

ファイルの最後の行の末尾に欠損値および行末シーケンスが存在する場合、textscan はそれらのフィールドに空の値を返します。これにより、出力セル配列 C 内の個々のセルが確実に同じサイズになります。

'ExpChars' - 指数文字'eEdD' (既定の設定) | 文字列

指数文字は、'ExpChars' と文字列で構成されるコンマ区切りのペアとして指定します。既定の指数文字は eEd および D です。

'HeaderLines' - ヘッダーの行数0 (既定の設定) | 正の整数

テキストのヘッダー行の数は、'HeaderLines' と正の整数で構成されるコンマ区切りのペアとして指定します。textscan はヘッダー行 (現在の行の残りを含む) をスキップします。

'MultipleDelimsAsOne' - 多重区切り記号の取り扱い0 (false) (既定の設定) | 1 (true)

多重区切り記号の取り扱いは、'MultipleDelimsAsOne'true または false で構成されるコンマ区切りのペアとして指定します。true の場合、関数 textscan は連続した区切り記号を 1 つの区切り記号として扱います。区切り記号が空白で分けられて繰り返された場合も、1 つの区切り記号として扱われます。Delimiter オプションも指定しなければなりません。

例: 'MultipleDelimsAsOne',1

'ReturnOnError' - 関数 textscan が読み取りまたは変換に失敗したときの動作1 (true) (既定の設定) | 0 (false)

関数 textscan が読み取りまたは変換に失敗したときの動作は、'ReturnOnError'true または false で構成されるコンマ区切りのペアとして指定します。true の場合、textscan はエラーを出さずに終了し、読み込んだすべてのフィールドを返します。false の場合、textscan はエラーを出して終了し、出力セル配列を返しません。

'TreatAsEmpty' - 空の値として扱う文字列文字列 | 文字列のセル配列

空の値として扱われる文字列は、'TreatAsEmpty'と文字列または文字列のセル配列で構成されるコンマ区切りのペアとして指定します。このオプションは数値フィールドのみに適用されます。

'Whitespace' - 空白文字' \b\t' (既定の設定) | 文字列

空白文字は、'Whitespace' と 1 つまたは複数の文字を含む文字列とで構成されるコンマ区切りのペアとして指定します。Whitespace が空で ('')、formatSpec が文字列変換指定子を含まない限り、関数 textscan は空白文字 char(32) を指定した Whitespace に追加します。

次のエスケープ シーケンスの 1 つを空白文字として指定した場合、関数 textscan は、シーケンスを対応する制御文字に変換します。

\bバックスペース
\n改行
\rキャリッジ リターン
\tタブ
\\バックスラッシュ (\)

出力引数

すべて展開する

C - ファイルまたは文字列データセル配列

ファイルまたは文字列データは、セル配列として返されます。

formatSpec で指定された各数値変換指定子に対して、関数 textscan は、出力セル配列 C に対する K 行 1 列の MATLAB 数値ベクトルを返します。ここで、K は関数 textscan が指定子と一致するフィールドを検索する回数です。

formatSpec で指定された各文字列変換指定子に対して、関数 textscan は、K 行 1 列の文字列のセル ベクトルを返します。ここで、K は関数 textscan が指定子と一致するフィールドを検索する回数です。フィールド幅演算子を含む各文字変換で、関数 textscanKM 列の文字配列を返します。ここで M はフィールド幅です。

position - ファイルまたは文字列の位置整数

スキャン終了時のファイルまたは文字列の位置は、クラス double の整数として返されます。ファイルの場合、ftell(fileID) と指定すると、関数 textscan の呼び出し後に同じ値が返されます。文字列の場合、position は、関数 textscan により読み込まれた文字数を示します。

詳細

すべて展開する

アルゴリズム

関数 textscan は、オーバーフロー、切り捨て、および NaNInf-Inf の使用に関する MATLAB の規則に応じて、数値フィールドを指定された出力タイプに変換します。たとえば、MATLAB は整数 NaN をゼロとして表示します。関数 textscan が、整数の書式指定子 (%d%u など) に関連付けられた空のフィールドを検出すると、空の値を NaN ではなくゼロとして返します

関数 textscan は、データ フィールドの処理に先頭の空白文字を含めません。数値データを処理する場合、関数 textscan は終わりの空白も無視します。

関数 textscan は、指定した数値タイプに実数部と虚数部を変換し (%dまたは %f)、複素数全体を複素数フィールドに取り込みます。複素数の有効な形式は、以下のようになります。

±<real>±<imag>i|j

例: 5.7-3.1i

±<imag>i|j

例: -7j

組み込んだ空白を複素数に含めないでください。textscan は、組み込んだ空白をフィールドの区切り記号と解釈します。

参考

| | | | | | | |

この情報は役に立ちましたか?