importdata

2025-06-06

importdataの基本的な使い方

最も一般的な使い方は以下の通りです。

A = importdata(filename);
  • filename: 読み込みたいファイルの名前(パスを含むことも可能)を指定します。

このコマンドを実行すると、filenameで指定されたファイルの内容が変数Aに読み込まれます。importdataは、ファイルの拡張子を見て適切な読み込み方法を自動的に判断しようとします。

主な機能と特徴

  1. 自動ファイルタイプ検出: importdataは、ファイルの拡張子(例: .txt, .csv, .jpg, .mat, .wavなど)に基づいて、適切なヘルパー関数(例: テキストファイルにはdlmread、画像ファイルにはimreadなど)を呼び出し、データの読み込みを試みます。

  2. 区切り文字(Delimiter)の指定: テキストファイルの場合、データの列が何で区切られているか(例: カンマ,, スペース, タブ\tなど)を指定できます。

    A = importdata(filename, delimiterIn);
    
    • delimiterIn: 区切り文字を文字列で指定します。例えば、CSVファイルなら','、タブ区切りなら'\t'です。
  3. ヘッダー行のスキップ: テキストファイルにデータの前にヘッダー行がある場合、そのヘッダー行の数を指定してスキップすることができます。

    A = importdata(filename, delimiterIn, headerlinesIn);
    
    • headerlinesIn: スキップするヘッダー行の数を非負の整数で指定します。例えば、ヘッダーが1行なら1と指定します。
  4. 出力引数: importdataは、読み込んだデータだけでなく、検出された区切り文字やヘッダー行の数なども出力することができます。

    [A, delimiterOut, headerlinesOut] = importdata(filename);
    
    • A: 読み込まれたデータ。
    • delimiterOut: 検出された区切り文字。
    • headerlinesOut: 検出されたヘッダー行の数。
  5. 出力形式:

    • ファイルが数値データのみのシンプルな表形式の場合、Aは数値の行列として返されることが多いです。
    • ファイルに数値とテキストが混在している場合や、より複雑な構造の場合、Aはデータ、テキストデータ、ヘッダーなどのフィールドを持つ構造体として返されることがあります。例えば、A.dataで数値データ、A.textdataでテキストデータにアクセスできます。
  6. クリップボードからの読み込み: ファイルだけでなく、システムクリップボードにコピーされたデータも読み込むことができます。

    A = importdata('-pastespecial');
    

具体的な使用例

例1: カンマ区切りのCSVファイルの読み込み

data.csvというファイルに以下の内容が書かれているとします。

Name,Age,Score
Alice,30,85
Bob,25,92
Charlie,35,78

Octaveでこのファイルを読み込むには、次のようにします。

data_struct = importdata('data.csv', ',', 1); % カンマ区切り、1行のヘッダーをスキップ
disp(data_struct.data);      % 数値データのみを表示
disp(data_struct.colheaders); % 列ヘッダーを表示

出力:

   85
   92
   78

{'Name', 'Age', 'Score'}

※ Octaveのバージョンによっては、data_struct.colheadersではなくdata_struct.textdata(1,:)などにヘッダー情報が入る場合があります。

例2: スペース区切りのテキストファイルの読み込み

measurements.txtというファイルに以下の内容が書かれているとします。

10.5 20.1 30.7
11.2 21.5 31.0
10.8 20.8 30.5
M = importdata('measurements.txt');
disp(M);
   10.500   20.100   30.700
   11.200   21.500   31.000
   10.800   20.800   30.500
  • 大規模なファイルを扱う場合、importdataのパフォーマンスが低下することがあります。
  • importdataは非常に柔軟ですが、非常に複雑な形式のファイル(例えば、不規則なデータ構造や、同一行に複数のデータタイプが混在している場合など)では、期待通りの結果が得られないことがあります。その場合、textscanfopenfgetlなどのより低レベルなファイルI/O関数を組み合わせて、カスタムの読み込みスクリプトを作成する必要があるかもしれません。


Octave importdata の一般的なエラーとトラブルシューティング

ファイルが見つからない (Error: 'filename' not found)

最も頻繁に発生するエラーの一つです。importdataが指定されたファイルを見つけられない場合に発生します。

  • トラブルシューティング:
    1. ファイル名の確認: ファイル名にスペルミスがないか、大文字・小文字が合っているか(特にLinux/macOSの場合、大文字・小文字を区別します)を確認します。
    2. パスの確認:
      • ファイルがOctaveの現在の作業ディレクトリにある場合は、ファイル名だけで十分です。
      • ファイルが別の場所にある場合は、フルパス(例: C:\Users\YourUser\Documents\data.csv または /home/youruser/data.csv)を指定するか、相対パス(例: ../data/data.csv)を正しく指定していることを確認します。
      • pwdコマンドで現在の作業ディレクトリを確認し、ls (Windowsの場合はdir) コマンドでファイルがそのディレクトリに存在するかを確認します。
      • cdコマンドでファイルの存在するディレクトリに移動することも有効です。
    3. ファイルの存在確認: 実際にファイルが指定された場所に存在するか、エクスプローラーやターミナルで確認します。
  • 原因:
    • ファイル名が間違っている(スペルミスなど)。
    • ファイルが存在しないパスを指定している。
    • Octaveの現在の作業ディレクトリ(Current Working Directory: CWD)にファイルがない、または指定されたパスが間違っている。
  • エラーメッセージの例:
    error: importdata: 'nonexistent_file.txt' not found
    

データ形式の不一致 (Error: The data file has a wrong format)

importdataがファイルの形式を自動的に認識できない場合や、指定した区切り文字やヘッダー行の指定がファイルの内容と合っていない場合に発生します。

  • トラブルシューティング:
    1. ファイルの確認: テキストエディタ(メモ帳、VS Code、Sublime Textなど)でファイルを開き、実際のファイルの内容を確認します。
      • 区切り文字は何ですか?(カンマ、タブ、スペース、セミコロンなど)
      • ヘッダー行はありますか? 何行ありますか?
      • 数値データ以外の文字(文字列など)が数値の列に混在していませんか?
    2. delimiterInの指定: 実際の区切り文字を正しく指定します。
      • カンマ区切り: importdata('file.csv', ',')
      • タブ区切り: importdata('file.csv', '\t')
      • スペース区切り: importdata('file.txt', ' ') または指定しない(デフォルトがスペースの場合が多い)
    3. headerlinesInの指定: スキップすべきヘッダー行の数を正しく指定します。
      • ヘッダーがない場合: 0 または省略
      • 1行ヘッダーがある場合: 1
    4. 混合データの処理: 数値とテキストが混在している場合は、importdataが構造体としてデータを返すことを理解します。数値データはdata.data、テキストデータはdata.textdataに格納されます。必要に応じて、data.textdataから目的の情報を抽出します。
    5. より厳密な読み込み: importdataでうまくいかない場合は、より低レベルな関数(textscan, dlmread)の使用を検討します。
      • dlmreadは、純粋な数値データで、ヘッダーのない区切り形式のファイルを読み込むのに適しています。
      • textscanは、非常に柔軟で、数値、文字列、混合データなど、複雑な形式のファイルを細かく制御して読み込むことができます。
  • 原因:
    • ファイルが指定された区切り文字で区切られていない(例: カンマ区切りのファイルをスペース区切りで読もうとしている)。
    • 数値データではない文字が数値の列に含まれている。
    • 指定したヘッダー行の数が間違っている(例えば、データ部分をヘッダーとしてスキップしてしまう、またはヘッダーをスキップし忘れる)。
    • ファイルがバイナリ形式だが、importdataがテキストファイルとして解釈しようとしている。
  • エラーメッセージの例:
    error: importdata: The data file 'data.csv' has a wrong format.
    
    または、エラーメッセージが出ないが、期待した形式でデータが読み込まれない(例: 全てNaNになる、構造体ではなく数値行列になるが中身がおかしい)。

メモリ不足 (Error: out of memory または segmentation fault)

非常に大きなファイルを読み込もうとした際に発生することがあります。

  • トラブルシューティング:
    1. メモリの確認: システムの利用可能なメモリを確認します。
    2. チャンクごとの読み込み: ファイル全体を一度に読み込むのではなく、ファイルの特定の行範囲だけを読み込む(dlmreadなどで行数と列数を指定する)か、ファイルを小さなチャンクに分割してループで読み込み、処理後にメモリから解放する方法を検討します。
    3. より効率的なデータ型: データの精度が不要な場合は、singleintなどのより少ないメモリを使用するデータ型で読み込むことを検討します(ただし、importdataでは直接指定できません)。
    4. 不要な変数のクリア: 読み込み前に、Octaveワークスペース内の不要な変数をclearコマンドで削除し、メモリを解放します。
    5. 64ビット版Octaveの使用: 32ビット版Octaveを使用している場合、より多くのメモリを扱える64ビット版に切り替えることを検討します。
  • 原因:
    • ファイルが非常に大きく、システムメモリを使い果たしている。
    • Octaveのデータ構造が扱えるサイズを超えている。
  • エラーメッセージの例:
    error: out of memory or dimension is too large for Octave's index type
    
    または、Octaveがクラッシュする(セグメンテーションフォールト)。

ファイルパーミッションの問題 (Error: permission denied)

ファイルへの読み込み権限がない場合に発生します。

  • トラブルシューティング:
    1. ファイル権限の確認: ファイルのプロパティ(Windows)またはls -l(Linux/macOS)で、ファイルに読み取り権限があるか確認します。必要であれば権限を変更します。
    2. ディレクトリ権限の確認: ファイルが存在するディレクトリにアクセス権限があるか確認します。
    3. 他のプログラムの確認: ファイルがWordやExcelなど他のプログラムで開かれていないか確認し、開かれている場合は閉じてから再度試します。
  • 原因:
    • ファイルが読み取り専用になっている。
    • ファイルが存在するディレクトリに対する読み取り権限がない。
    • ファイルが別のプログラムによってロックされている。
  • エラーメッセージの例:
    error: importdata: permission denied 'read_only_file.txt'
    

importdataの出力形式の誤解

エラーではないが、期待したデータが取得できない場合に発生します。特に、数値とテキストが混在するファイルを読み込んだ場合によく見られます。

  • トラブルシューティング:
    1. 戻り値の確認: importdataを実行した後、変数Aの型をclass(A)で確認します。
      • doublesingleであれば、数値行列として読み込まれています。
      • structであれば、構造体として読み込まれています。この場合、A.dataA.textdata(あるいはA.colheaders, A.rowheadersなど、ファイルの内容によって異なるフィールド名)を確認する必要があります。
    2. ファイル内容と戻り値の対応付け:
      • 数値のみのファイル: 通常は数値行列 (double)。
      • ヘッダー付き、またはテキストと数値が混在するファイル: 構造体 (struct)。
    3. ヘルプの参照: help importdataを実行して、関数の詳細な動作と戻り値の形式を理解します。特に、importdataが構造体を返す場合の各フィールドの意味を確認します。
  • 問題:
    • importdataが構造体を返すのに、数値行列を期待して.data.textdataにアクセスし忘れる。
    • ヘッダー行がデータに含まれてしまう、またはデータがヘッダー行に誤って格納される。
  • Octaveバージョンの確認: 使用しているOctaveのバージョン(octave --version)によって、importdataの動作やサポートされる機能が異なる場合があります。古いバージョンでは特定の機能が利用できない、またはバグがある可能性があります。
  • 詳細なエラーメッセージの確認: Octaveが返すエラーメッセージを注意深く読みます。多くの場合、問題の原因を示す手がかりが含まれています。
  • 小さなサンプルファイルで試す: 問題のファイルが非常に大きい場合や複雑な場合は、そのファイルから数行を抜き出して、よりシンプルな小さなサンプルファイルを作成し、それを使ってimportdataの動作を確認します。


シンプルな数値データのテキストファイルを読み込む

最も一般的なケースです。ファイルに数値データのみが含まれており、スペースやカンマなどの区切り文字で区切られている場合です。

ファイル: data.txt の内容

10 20 30
11 21 31
12 22 32

Octave コード

% ファイルが存在することを確認してください (例: Octaveの現在のディレクトリに配置)
filename = 'data.txt';

% データを読み込む
A = importdata(filename);

% 読み込まれたデータを表示
disp('読み込まれたデータ:');
disp(A);

% データの型を確認 (通常は double の行列)
disp(['データの型: ', class(A)]);

実行結果

読み込まれたデータ:
   10   20   30
   11   21   31
   12   22   32
データの型: double

カンマ区切り(CSV)ファイルを読み込む

CSV (Comma Separated Values) ファイルは、データがカンマで区切られている一般的な形式です。

ファイル: sales.csv の内容

Product,Quantity,Price
Apple,100,1.20
Banana,150,0.80
Orange,75,1.50

Octave コード

% ファイルが存在することを確認
filename = 'sales.csv';

% 区切り文字としてカンマを指定し、ヘッダー行を1行スキップしてデータを読み込む
% ヘッダー行があるので、戻り値は構造体になります
sales_data = importdata(filename, ',', 1);

disp('読み込まれた数値データ (sales_data.data):');
disp(sales_data.data);

disp('ヘッダー行 (sales_data.colheaders):');
disp(sales_data.colheaders);

disp('元のテキストデータ全体 (sales_data.textdata):');
disp(sales_data.textdata);

実行結果

読み込まれた数値データ (sales_data.data):
   100.000    1.200
   150.000    0.800
    75.000    1.500

ヘッダー行 (sales_data.colheaders):
{
  [1,1] = Product
  [1,2] = Quantity
  [1,3] = Price
}

元のテキストデータ全体 (sales_data.textdata):
{
  [1,1] = Product
  [1,2] = Quantity
  [1,3] = Price
  [2,1] = Apple
  [2,2] = 100
  [2,3] = 1.2
  [3,1] = Banana
  [3,2] = 150
  [3,3] = 0.8
  [4,1] = Orange
  [4,2] = 75
  [4,3] = 1.5
}

ポイント:

  • sales_data.textdata にはファイル全体のテキストデータがセル配列として格納されます。
  • ヘッダー情報は sales_data.colheaders (Octaveのバージョンによっては sales_data.textdata(1,:)) にセル配列として格納されます。
  • 数値データは sales_data.data に行列として格納されます。

タブ区切りファイルを読み込む

タブ区切りファイルもテキストデータの一種で、区切り文字を '\t' で指定します。

ファイル: inventory.tsv の内容

ItemID	Description	Stock
001	Laptop	50
002	Monitor	120
003	Keyboard	80

Octave コード

filename = 'inventory.tsv';

% タブ区切りを指定し、ヘッダー行をスキップ
inventory_data = importdata(filename, '\t', 1);

disp('読み込まれた数値データ (inventory_data.data):');
disp(inventory_data.data);

disp('ヘッダー行 (inventory_data.colheaders):');
disp(inventory_data.colheaders);

実行結果

読み込まれた数値データ (inventory_data.data):
    50
   120
    80

ヘッダー行 (inventory_data.colheaders):
{
  [1,1] = ItemID
  [1,2] = Description
  [1,3] = Stock
}

区切り文字を自動検出して読み込む

importdata は、区切り文字を明示的に指定しない場合、自動的に検出を試みます。また、検出された区切り文字やヘッダー行の数を戻り値として取得することも可能です。

ファイル: mixed_data.txt の内容 (例: スペース区切り)

ID Name Value
101 Alice 15.5
102 Bob 22.1
103 Charlie 18.0

Octave コード

filename = 'mixed_data.txt';

% 区切り文字とヘッダー行の自動検出を任せる
[data_out, delimiter_out, headerlines_out] = importdata(filename);

disp('読み込まれた数値データ (data_out.data):');
disp(data_out.data);

disp('検出された区切り文字:');
disp(delimiter_out);

disp('検出されたヘッダー行数:');
disp(headerlines_out);

disp('すべてのテキストデータ (data_out.textdata):');
disp(data_out.textdata);

実行結果

読み込まれた数値データ (data_out.data):
   101.000   15.500
   102.000   22.100
   103.000   18.000

検出された区切り文字:
 

検出されたヘッダー行数:
1

すべてのテキストデータ (data_out.textdata):
{
  [1,1] = ID
  [1,2] = Name
  [1,3] = Value
  [2,1] = 101
  [2,2] = Alice
  [2,3] = 15.5
  [3,1] = 102
  [3,2] = Bob
  [3,3] = 22.1
  [4,1] = 103
  [4,2] = Charlie
  [4,3] = 18
}

クリップボードからデータを読み込む

-pastespecial オプションを使うと、クリップボードにコピーされたテキストデータを直接読み込むことができます。

操作手順

  1. 以下のテキストをクリップボードにコピーします。
    1 2 3
    4 5 6
    7 8 9
    
  2. Octaveのコマンドラインで以下のコードを実行します。

Octave コード

% クリップボードからデータを読み込む
clipboard_data = importdata('-pastespecial');

disp('クリップボードから読み込まれたデータ:');
disp(clipboard_data);

実行結果

クリップボードから読み込まれたデータ:
   1   2   3
   4   5   6
   7   8   9

画像ファイルを読み込む

importdataは、画像ファイル(例: JPG, PNG)も読み込むことができます。この場合、画像データは数値行列として返されます。

前提
適切な画像ファイル(例: my_image.jpg)が現在のディレクトリにあるとします。

Octave コード

filename = 'my_image.jpg'; % 読み込みたい画像ファイル名

% 画像データを読み込む
img_data = importdata(filename);

disp('画像データのサイズ:');
disp(size(img_data));

% 画像を表示(Octaveに画像表示機能が設定されている場合)
% Windows や Mac では通常動きますが、Linux では別途設定が必要な場合があります。
% figure;
% image(img_data);
% title('読み込まれた画像');

実行結果例
(画像ファイルによってサイズは異なります)

画像データのサイズ:
   480   640     3

480は高さ、640は幅、3はRGBチャンネルを示します。



csvread および dlmread (数値データ専用)

これらの関数は、区切り形式のテキストファイルから数値データを読み込むのに特化しています。importdataよりもシンプルで、ヘッダー行がないか、ヘッダー行をスキップするだけで良い場合に適しています。

  • dlmread(filename, delimiter): 指定された区切り文字で区切られた数値データを読み込みます。
  • csvread(filename): カンマ区切り(CSV)の数値データを読み込みます。

利点

  • 特定の区切り文字や行/列範囲の指定が容易。
  • 非常にシンプルで高速。

欠点

  • 複雑なファイル形式には対応できない。
  • 数値データしか扱えない(テキストデータやヘッダーを直接読み込めない)。

コード例

ファイル: numbers.csv の内容

1.1,2.2,3.3
4.4,5.5,6.6
7.7,8.8,9.9

Octave コード (csvread)

% csvread を使用してカンマ区切りの数値を読み込む
data_csv = csvread('numbers.csv');
disp('csvreadで読み込まれたデータ:');
disp(data_csv);

ファイル: tab_data.txt の内容

100 200 300
110 210 310
120 220 320

(タブ文字で区切られていると仮定)

Octave コード (dlmread)

% dlmread を使用してタブ区切りの数値を読み込む
% タブ区切りは '\t' で指定
data_dlm = dlmread('tab_data.txt', '\t');
disp('dlmreadで読み込まれたデータ:');
disp(data_dlm);

% 特定の行や列だけを読み込む例 (dlmreadは行/列オフセットも指定可能)
% 2行目から、2列目から読み込み (0-indexed)
% data_part = dlmread('tab_data.txt', '\t', 1, 1);
% disp('dlmreadで一部だけ読み込まれたデータ:');
% disp(data_part);

textscan (複雑なテキストファイルに最適)

textscanは、テキストファイルを非常に柔軟に解析できる強力な関数です。数値、文字列、日付など、異なるデータ型が混在する行を読み込むのに適しています。C言語のsscanfに似たフォーマット指定子を使用します。

利点

  • ファイル全体を一度に読み込むのではなく、ブロックごとに読み込むことも可能で、大規模なファイル処理にも対応できる。
  • エラーハンドリングが柔軟。
  • 特定の列をスキップしたり、複数の区切り文字を扱ったりできる。
  • 異なるデータ型を同時に読み込める。

欠点

  • 正確なフォーマット文字列を理解する必要がある。
  • importdataよりも複雑で、学習に時間がかかる。

コード例

ファイル: mixed_records.txt の内容

ID,Name,Score,Date
1,Alice,85.5,2023-01-15
2,Bob,92.0,2023-02-20
3,Charlie,78.2,2023-03-01

Octave コード

filename = 'mixed_records.txt';

% ファイルを開く
fid = fopen(filename, 'r');
if fid == -1
    error('ファイルを開けませんでした: %s', filename);
end

% ヘッダー行をスキップ
fgetl(fid); % 最初の1行(ヘッダー)を読み捨て

% データを読み込むためのフォーマットを指定
% %d: 整数, %s: 文字列, %f: 浮動小数点数
% 区切り文字はフォーマット文字列に含めない (TextScanのdelimiter引数で指定)
formatSpec = '%d%s%f%s';

% textscan を使用してデータを読み込む
% 'Delimiter', ',' でカンマ区切りを指定
% 'EndOfLine', '\n' は改行コードを指定 (Windowsでは '\r\n' の場合も)
% 'CollectOutput', 0 で各データ型を別のセルとして保持
C = textscan(fid, formatSpec, 'Delimiter', ',', 'EndOfLine', '\n', 'CollectOutput', 0);

% ファイルを閉じる
fclose(fid);

% 読み込まれたデータを表示
disp('ID:');
disp(C{1}); % 最初のセルにIDが入る

disp('Name:');
disp(C{2}); % 2番目のセルに名前が入る (セル配列)

disp('Score:');
disp(C{3}); % 3番目のセルにスコアが入る

disp('Date:');
disp(C{4}); % 4番目のセルに日付が入る (セル配列)

% 例えば、名前とスコアを行列にまとめたい場合:
% names = C{2};
% scores = C{3};
% for i = 1:numel(names)
%     fprintf('%s: %.1f\n', names{i}, scores(i));
% end

load (MATLAB .mat ファイルとシンプルなASCIIファイル)

load関数は、主にOctave/MATLABのバイナリファイル(.matファイル)を読み込むために使われますが、シンプルな数値データのテキストファイルを読み込むこともできます。

利点

  • シンプルな数値のASCIIファイルにも対応。
  • .matファイルの標準的な読み込み方法。

欠点

  • 区切り文字の指定は限定的。
  • テキストファイルの場合、ヘッダーや文字列データは扱えない。

コード例

ファイル: simple_nums.txt の内容

1 2 3
4 5 6

(スペース区切り)

Octave コード

filename = 'simple_nums.txt';

% load 関数でASCIIデータを読み込む
% '-ascii' オプションは、ファイルがヘッダーのない数値のテキストであることを示す
data_load = load(filename, '-ascii');
disp('loadで読み込まれたデータ:');
disp(data_load);

ファイル: my_variables.mat が事前に save my_variables.mat var1 var2 で作成されている場合

% .mat ファイルを読み込む
load('my_variables.mat');
% これにより、ファイルに保存されていた変数 (例: var1, var2) がワークスペースに復元される
disp('my_variables.mat から復元された var1:');
disp(var1);
disp('my_variables.mat から復元された var2:');
disp(var2);

xlsread (スプレッドシートファイル - .xls, .xlsx, .ods)

Octaveには、スプレッドシートファイル(Excelの.xls.xlsx、OpenDocument Spreadsheetの.odsなど)を読み込むための関数も提供されています。ただし、これらの機能は通常、追加のパッケージ(ioパッケージなど)や外部ソフトウェア(Javaのサポートなど)に依存する場合があります。

前提

  • pkg load io でパッケージがロードされていること
  • io パッケージがインストールされていること (pkg install -forge io)

利点

  • Excelなどのスプレッドシートファイルを直接読み込める。

欠点

  • パフォーマンスが遅い場合がある。
  • 追加パッケージのインストールと依存関係の管理が必要。

コード例

ファイル: spreadsheet_data.xlsx が存在し、Sheet1にデータがある場合

% ioパッケージがロードされていることを確認
pkg load io;

filename = 'spreadsheet_data.xlsx';

% スプレッドシートからデータを読み込む
% data_xls: 数値データ
% text_xls: テキストデータ(セル配列)
% raw_xls: 生データ(セル配列)
[data_xls, text_xls, raw_xls] = xlsread(filename, 'Sheet1');

disp('Excelファイルから読み込まれた数値データ:');
disp(data_xls);

disp('Excelファイルから読み込まれたテキストデータ:');
disp(text_xls);

低レベルI/O (fopen, fgetl, fscanf, fread)

非常に特殊なファイル形式や、行ごとに厳密な処理が必要な場合に、低レベルのファイルI/O関数を使用します。これは最も柔軟ですが、最も複雑な方法です。

利点

  • 大規模なファイルを効率的に読み込める(メモリにすべて読み込まずにストリーム処理)。
  • あらゆる種類のカスタムファイル形式に対応できる。
  • ファイルの読み込みプロセスを完全に制御できる。

欠点

  • ファイルポインタの管理や、読み込んだデータの解析に手間がかかる。
  • 実装が複雑で、エラーハンドリングを自分で記述する必要がある。

コード例

ファイル: custom_log.txt の内容

LOG_START: 2023-01-01
SensorID: S001,Value: 12.34
SensorID: S002,Value: 56.78
LOG_END
filename = 'custom_log.txt';

% ファイルを開く
fid = fopen(filename, 'r');
if fid == -1
    error('ファイルを開けませんでした: %s', filename);
end

data_values = [];
sensor_ids = {};

% ファイルを行ごとに読み込む
while ~feof(fid) % ファイルの終わりまでループ
    line = fgetl(fid); % 1行読み込む

    % 読み込みに失敗したか、ファイルの終わりであればループを抜ける
    if !ischar(line)
        break;
    end

    % 特定の行(例: "SensorID:"で始まる行)を解析
    if strncmp(line, 'SensorID:', length('SensorID:'))
        % sscanf を使用して行からデータを抽出
        % フォーマット文字列を正確に指定する必要がある
        % '%*s' は文字列を読み込むが代入しない(スキップ)
        % '%d' は整数, '%f' は浮動小数点数
        parsed_data = sscanf(line, 'SensorID: S%d,Value: %f');
        
        if numel(parsed_data) == 2
            sensor_ids{end+1} = sprintf('S%03d', parsed_data(1));
            data_values = [data_values; parsed_data(2)];
        end
    end
end

% ファイルを閉じる
fclose(fid);

disp('抽出されたセンサーID:');
disp(sensor_ids);
disp('抽出された値:');
disp(data_values);