importdata
importdata
の基本的な使い方
最も一般的な使い方は以下の通りです。
A = importdata(filename);
filename
: 読み込みたいファイルの名前(パスを含むことも可能)を指定します。
このコマンドを実行すると、filename
で指定されたファイルの内容が変数A
に読み込まれます。importdata
は、ファイルの拡張子を見て適切な読み込み方法を自動的に判断しようとします。
主な機能と特徴
-
自動ファイルタイプ検出:
importdata
は、ファイルの拡張子(例:.txt
,.csv
,.jpg
,.mat
,.wav
など)に基づいて、適切なヘルパー関数(例: テキストファイルにはdlmread
、画像ファイルにはimread
など)を呼び出し、データの読み込みを試みます。 -
区切り文字(Delimiter)の指定: テキストファイルの場合、データの列が何で区切られているか(例: カンマ
,
, スペース, タブ
\t
など)を指定できます。A = importdata(filename, delimiterIn);
delimiterIn
: 区切り文字を文字列で指定します。例えば、CSVファイルなら','
、タブ区切りなら'\t'
です。
-
ヘッダー行のスキップ: テキストファイルにデータの前にヘッダー行がある場合、そのヘッダー行の数を指定してスキップすることができます。
A = importdata(filename, delimiterIn, headerlinesIn);
headerlinesIn
: スキップするヘッダー行の数を非負の整数で指定します。例えば、ヘッダーが1行なら1
と指定します。
-
出力引数:
importdata
は、読み込んだデータだけでなく、検出された区切り文字やヘッダー行の数なども出力することができます。[A, delimiterOut, headerlinesOut] = importdata(filename);
A
: 読み込まれたデータ。delimiterOut
: 検出された区切り文字。headerlinesOut
: 検出されたヘッダー行の数。
-
出力形式:
- ファイルが数値データのみのシンプルな表形式の場合、
A
は数値の行列として返されることが多いです。 - ファイルに数値とテキストが混在している場合や、より複雑な構造の場合、
A
はデータ、テキストデータ、ヘッダーなどのフィールドを持つ構造体として返されることがあります。例えば、A.data
で数値データ、A.textdata
でテキストデータにアクセスできます。
- ファイルが数値データのみのシンプルな表形式の場合、
-
クリップボードからの読み込み: ファイルだけでなく、システムクリップボードにコピーされたデータも読み込むことができます。
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
は非常に柔軟ですが、非常に複雑な形式のファイル(例えば、不規則なデータ構造や、同一行に複数のデータタイプが混在している場合など)では、期待通りの結果が得られないことがあります。その場合、textscan
やfopen
、fgetl
などのより低レベルなファイルI/O関数を組み合わせて、カスタムの読み込みスクリプトを作成する必要があるかもしれません。
Octave importdata
の一般的なエラーとトラブルシューティング
ファイルが見つからない (Error: 'filename' not found)
最も頻繁に発生するエラーの一つです。importdata
が指定されたファイルを見つけられない場合に発生します。
- トラブルシューティング:
- ファイル名の確認: ファイル名にスペルミスがないか、大文字・小文字が合っているか(特にLinux/macOSの場合、大文字・小文字を区別します)を確認します。
- パスの確認:
- ファイルがOctaveの現在の作業ディレクトリにある場合は、ファイル名だけで十分です。
- ファイルが別の場所にある場合は、フルパス(例:
C:\Users\YourUser\Documents\data.csv
または/home/youruser/data.csv
)を指定するか、相対パス(例:../data/data.csv
)を正しく指定していることを確認します。 pwd
コマンドで現在の作業ディレクトリを確認し、ls
(Windowsの場合はdir
) コマンドでファイルがそのディレクトリに存在するかを確認します。cd
コマンドでファイルの存在するディレクトリに移動することも有効です。
- ファイルの存在確認: 実際にファイルが指定された場所に存在するか、エクスプローラーやターミナルで確認します。
- 原因:
- ファイル名が間違っている(スペルミスなど)。
- ファイルが存在しないパスを指定している。
- Octaveの現在の作業ディレクトリ(Current Working Directory: CWD)にファイルがない、または指定されたパスが間違っている。
- エラーメッセージの例:
error: importdata: 'nonexistent_file.txt' not found
データ形式の不一致 (Error: The data file has a wrong format)
importdata
がファイルの形式を自動的に認識できない場合や、指定した区切り文字やヘッダー行の指定がファイルの内容と合っていない場合に発生します。
- トラブルシューティング:
- ファイルの確認: テキストエディタ(メモ帳、VS Code、Sublime Textなど)でファイルを開き、実際のファイルの内容を確認します。
- 区切り文字は何ですか?(カンマ、タブ、スペース、セミコロンなど)
- ヘッダー行はありますか? 何行ありますか?
- 数値データ以外の文字(文字列など)が数値の列に混在していませんか?
delimiterIn
の指定: 実際の区切り文字を正しく指定します。- カンマ区切り:
importdata('file.csv', ',')
- タブ区切り:
importdata('file.csv', '\t')
- スペース区切り:
importdata('file.txt', ' ')
または指定しない(デフォルトがスペースの場合が多い)
- カンマ区切り:
headerlinesIn
の指定: スキップすべきヘッダー行の数を正しく指定します。- ヘッダーがない場合:
0
または省略 - 1行ヘッダーがある場合:
1
- ヘッダーがない場合:
- 混合データの処理: 数値とテキストが混在している場合は、
importdata
が構造体としてデータを返すことを理解します。数値データはdata.data
、テキストデータはdata.textdata
に格納されます。必要に応じて、data.textdata
から目的の情報を抽出します。 - より厳密な読み込み:
importdata
でうまくいかない場合は、より低レベルな関数(textscan
,dlmread
)の使用を検討します。dlmread
は、純粋な数値データで、ヘッダーのない区切り形式のファイルを読み込むのに適しています。textscan
は、非常に柔軟で、数値、文字列、混合データなど、複雑な形式のファイルを細かく制御して読み込むことができます。
- ファイルの確認: テキストエディタ(メモ帳、VS Code、Sublime Textなど)でファイルを開き、実際のファイルの内容を確認します。
- 原因:
- ファイルが指定された区切り文字で区切られていない(例: カンマ区切りのファイルをスペース区切りで読もうとしている)。
- 数値データではない文字が数値の列に含まれている。
- 指定したヘッダー行の数が間違っている(例えば、データ部分をヘッダーとしてスキップしてしまう、またはヘッダーをスキップし忘れる)。
- ファイルがバイナリ形式だが、
importdata
がテキストファイルとして解釈しようとしている。
- エラーメッセージの例:
または、エラーメッセージが出ないが、期待した形式でデータが読み込まれない(例: 全てNaNになる、構造体ではなく数値行列になるが中身がおかしい)。error: importdata: The data file 'data.csv' has a wrong format.
メモリ不足 (Error: out of memory または segmentation fault)
非常に大きなファイルを読み込もうとした際に発生することがあります。
- トラブルシューティング:
- メモリの確認: システムの利用可能なメモリを確認します。
- チャンクごとの読み込み: ファイル全体を一度に読み込むのではなく、ファイルの特定の行範囲だけを読み込む(
dlmread
などで行数と列数を指定する)か、ファイルを小さなチャンクに分割してループで読み込み、処理後にメモリから解放する方法を検討します。 - より効率的なデータ型: データの精度が不要な場合は、
single
やint
などのより少ないメモリを使用するデータ型で読み込むことを検討します(ただし、importdata
では直接指定できません)。 - 不要な変数のクリア: 読み込み前に、Octaveワークスペース内の不要な変数を
clear
コマンドで削除し、メモリを解放します。 - 64ビット版Octaveの使用: 32ビット版Octaveを使用している場合、より多くのメモリを扱える64ビット版に切り替えることを検討します。
- 原因:
- ファイルが非常に大きく、システムメモリを使い果たしている。
- Octaveのデータ構造が扱えるサイズを超えている。
- エラーメッセージの例:
または、Octaveがクラッシュする(セグメンテーションフォールト)。error: out of memory or dimension is too large for Octave's index type
ファイルパーミッションの問題 (Error: permission denied)
ファイルへの読み込み権限がない場合に発生します。
- トラブルシューティング:
- ファイル権限の確認: ファイルのプロパティ(Windows)または
ls -l
(Linux/macOS)で、ファイルに読み取り権限があるか確認します。必要であれば権限を変更します。 - ディレクトリ権限の確認: ファイルが存在するディレクトリにアクセス権限があるか確認します。
- 他のプログラムの確認: ファイルがWordやExcelなど他のプログラムで開かれていないか確認し、開かれている場合は閉じてから再度試します。
- ファイル権限の確認: ファイルのプロパティ(Windows)または
- 原因:
- ファイルが読み取り専用になっている。
- ファイルが存在するディレクトリに対する読み取り権限がない。
- ファイルが別のプログラムによってロックされている。
- エラーメッセージの例:
error: importdata: permission denied 'read_only_file.txt'
importdataの出力形式の誤解
エラーではないが、期待したデータが取得できない場合に発生します。特に、数値とテキストが混在するファイルを読み込んだ場合によく見られます。
- トラブルシューティング:
- 戻り値の確認:
importdata
を実行した後、変数A
の型をclass(A)
で確認します。double
やsingle
であれば、数値行列として読み込まれています。struct
であれば、構造体として読み込まれています。この場合、A.data
やA.textdata
(あるいはA.colheaders
,A.rowheaders
など、ファイルの内容によって異なるフィールド名)を確認する必要があります。
- ファイル内容と戻り値の対応付け:
- 数値のみのファイル: 通常は数値行列 (
double
)。 - ヘッダー付き、またはテキストと数値が混在するファイル: 構造体 (
struct
)。
- 数値のみのファイル: 通常は数値行列 (
- ヘルプの参照:
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 2 3 4 5 6 7 8 9
- 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);