csvread
csvread
の基本的な使い方
最も基本的な使い方は、ファイル名を引数として与えることです。
M = csvread('filename.csv');
これにより、filename.csv
というCSVファイルの内容が、数値行列M
としてOctaveに読み込まれます。この際、ファイルには数値データのみが含まれている必要があります。
オプションと詳細
csvread
には、読み込むデータの範囲を指定するためのオプション引数があります。
-
特定の行と列から読み込む ファイル全体ではなく、特定の開始行と開始列からデータを読み込みたい場合に利用します。オフセットは0から始まります(最初の行/列が0)。
M = csvread('filename.csv', R1, C1);
R1
: 読み込みを開始する行のオフセット(0から始まる)C1
: 読み込みを開始する列のオフセット(0から始まる)
例
ファイルの3行目、2列目から読み込みを開始する場合(1行目、1列目を0とする)M = csvread('mydata.csv', 2, 1);
-
特定の範囲を読み込む 特定の矩形範囲のデータのみを読み込みたい場合に利用します。
M = csvread('filename.csv', R1, C1, [R1 C1 R2 C2]);
R1
: 読み込みを開始する行のオフセットC1
: 読み込みを開始する列のオフセットR2
: 読み込みを終了する行のオフセットC2
: 読み込みを終了する列のオフセット
例
2行目から4行目まで、1列目から3列目までのデータを読み込む場合M = csvread('mydata.csv', 1, 0, [1 0 3 2]);
(これは、1行目のオフセット0、0列目のオフセット0を基準としています)
- オフセットの理解: 行と列のオフセットが0から始まる点に注意が必要です。これは、スプレッドシートのA1形式とは異なるため、混乱を招くことがあります。
- 非推奨: MATLABのドキュメント(OctaveはMATLABと互換性のある関数が多い)によると、
csvread
はより汎用性の高いreadmatrix
関数の使用が推奨されています。readmatrix
は、データ形式の自動検出、パフォーマンスの向上、エラーや欠損値の処理など、より多くの機能を提供します。Octaveでもreadmatrix
や、さらに柔軟なdlmread
(csvread
が内部的に呼び出す関数)の利用が推奨されることがあります。 - 数値データのみ:
csvread
は数値データのみを読み込むように設計されています。CSVファイルにテキスト(文字列)が含まれている場合、正しく読み込めないか、エラーが発生する可能性があります。
「ファイルが見つからない」エラー (File not found)
これは最もよくあるエラーの一つです。
エラーメッセージの例
error: 'filename.csv' not found
原因
- ファイルへのパスが正しくない。
- ファイルが現在の作業ディレクトリにない。
- 指定されたファイル名が間違っている。
トラブルシューティング
- パスの追加
addpath('C:\Users\YourUser\Documents')
のように、ファイルの存在するディレクトリをOctaveの検索パスに追加することもできます。 - フルパスの指定
ファイルが別のディレクトリにある場合は、フルパス(例:C:\Users\YourUser\Documents\data.csv
や/home/youruser/data/data.csv
)を指定してみてください。 - 現在の作業ディレクトリの確認
Octaveのコマンドプロンプトでpwd
と入力し、現在の作業ディレクトリを確認してください。CSVファイルがこのディレクトリにあるか、または正しいパスが指定されているかを確認します。 - ファイル名の確認
ファイル名にスペルミスがないか、拡張子(.csv
など)が正しいかを確認してください。
「ファイルに数値以外のデータが含まれている」エラー (Non-numeric data)
csvread
は、原則として数値データのみを読み込むように設計されています。ファイルにテキスト、日付、または空白以外の文字が含まれている場合、このエラーが発生します。
エラーメッセージの例
error: dlmread: Mismatch between file and format character vector.
error: Trouble reading 'Numeric' field from file (row number X, field number Y)
error: called from:
error: csvread at line Z, column A
または、エラーが出ずに予期しない結果(NaN
や0)が返されることもあります。
原因
- 数値の間に余分な空白文字や、数値と解釈できない文字が紛れ込んでいる。
- CSVファイルに空のセルが含まれており、それが適切に処理されていない。
- CSVファイルに日付データ(例: "2023-01-15")が含まれている。
- CSVファイルにテキストデータ(例: "Product A"、"High"など)が含まれている。
- CSVファイルにヘッダー行(列名など)が含まれている。
トラブルシューティング
- CSVファイルのクリーニング
可能であれば、ExcelなどのスプレッドシートソフトウェアでCSVファイルを開き、ヘッダーや非数値データを手動で削除または整形してからOctaveで読み込みます。 - より汎用的な関数の使用
csvread
は機能が限定的であるため、テキストや日付を含むCSVファイルを読み込む場合は、以下の関数を検討してください。- readmatrix (推奨)
Octaveの新しいバージョンで推奨されている関数です。テキスト、数値、日付など、さまざまなデータ型を自動的に認識し、テーブルとして読み込むことができます。非常に強力で柔軟性があります。T = readmatrix('filename.csv'); % 自動的にデータ型を推測して読み込む
- dlmread
csvread
が内部的に呼び出す関数で、より多くの制御オプションを提供します。特定の区切り文字(カンマ以外)を指定したり、特定の範囲を読み込んだりできます。M = dlmread('filename.csv', ','); % カンマ区切りで読み込む
- textscan / fgetl
最も低レベルな読み込み方法で、非常に複雑な形式のCSVファイルでも対応できますが、コードが複雑になります。CSVファイルを行ごとに読み込み、各行を解析することで、数値、テキスト、日付などを個別に処理できます。fid = fopen('filename.csv', 'r'); C = textscan(fid, '%f%s%f', 'Delimiter', ',', 'HeaderLines', 1); % 例: 数値, 文字列, 数値の3列を読み込み、1行スキップ fclose(fid);
- readmatrix (推奨)
- ヘッダー行のスキップ
ヘッダー行がある場合は、csvread
のオプションを使用してスキップします。たとえば、最初の1行がヘッダーであれば、R1=1
を指定します。M = csvread('filename.csv', 1, 0); % 最初の1行をスキップ
「エンコーディングの問題」エラー (Encoding issues)
CSVファイルが特定のエンコーディング(UTF-8, Shift-JISなど)で保存されている場合、Octaveがデフォルトで認識するエンコーディングと異なるため、文字化けや読み込みエラーが発生することがあります。
エラーメッセージの例
特定のエンコーディングエラーメッセージが直接表示されることは稀ですが、読み込みエラーとして現れたり、データが正しく読み込めなかったりします。
原因
- ファイルがシステムのデフォルトエンコーディング(例: WindowsのShift-JIS)とは異なるエンコーディングで保存されている。
- ファイルがUTF-8 BOM付きで保存されている。
トラブルシューティング
- テキストエディタでの変換
Notepad++(Windows)、Sublime Text、VS Codeなどの高機能なテキストエディタを使用して、CSVファイルのエンコーディングをUTF-8(BOMなし)などに変換して保存し直してからOctaveで読み込みます。 - dlmreadでエンコーディングを指定
dlmread
関数には、エンコーディングを指定するオプションがあります(Octaveのバージョンによってサポート状況が異なります)。M = dlmread('filename.csv', ',', 'encoding', 'UTF-8');
「範囲指定の誤り」エラー (Incorrect range specification)
csvread
でR1
, C1
, R2
, C2
などの範囲オフセットを間違って指定すると、予期しないデータが読み込まれたり、エラーが発生したりします。
エラーメッセージの例
通常、直接的なエラーメッセージは出ませんが、行列のサイズが期待と異なったり、NaN
や0が混ざったりします。
原因
- 指定した範囲がファイルサイズを超えている。
- オフセットが0から始まることを理解していない。
トラブルシューティング
- size関数で確認
読み込み後にsize(M)
コマンドを使って、読み込まれた行列のサイズが正しいか確認します。 - 小さなテストファイルで確認
まずは、数行数列の小さなテストCSVファイルを作成し、目的の範囲が正しく読み込まれるかを確認してください。 - 0ベースのオフセットを理解する
csvread
のオフセットは0から始まります。つまり、ファイルの最初の行はオフセット0、最初の列はオフセット0です。
非常に大きなCSVファイルを読み込もうとすると、Octaveのメモリが不足する場合があります。
エラーメッセージの例
error: out of memory
原因
- ファイルが非常に大きく、システムメモリに収まりきらない。
- 64-bit Octaveの使用
大量のメモリを扱う場合は、64-bit版のOctaveを使用していることを確認してください。 - システムのメモリ増強
根本的な解決策として、コンピュータのRAMを増強することを検討します。 - データをチャンクで読み込む
textscan
やfgetl
を使用して、ファイルをチャンク(ブロック)ごとに読み込み、処理後にメモリを解放するようなスクリプトを作成します。 - ファイルを分割する
可能であれば、CSVファイルをより小さな複数のファイルに分割し、それぞれを個別に読み込むか、必要な部分だけを読み込みます。 - より少ない範囲で読み込む
必要なデータだけを読み込むように、範囲指定のオプションを最大限に活用します。
準備:サンプルCSVファイルの作成
まず、以下の内容でsample_data.csv
という名前のファイルを作成し、Octaveが実行されるディレクトリ(または、後でフルパスを指定する)に保存してください。
sample_data.csv
Header1,Header2,Header3
10,20,30
11,21,31
12,22,32
もう一つ、ヘッダーなしのファイルも作成しましょう。
no_header_data.csv
1,2,3,4
5,6,7,8
9,10,11,12
最も基本的な使い方:ファイル全体を読み込む
これは、CSVファイルに数値データのみが含まれており、ヘッダー行がない場合に最も適した方法です。
% 1. ファイルを現在の作業ディレクトリに保存している場合
M1 = csvread('no_header_data.csv');
disp('--- 1. 基本的な読み込み (no_header_data.csv) ---');
disp(M1);
% 2. ファイルのフルパスを指定する場合 (例: Windowsの場合)
% M2 = csvread('C:\Users\YourUser\Documents\no_header_data.csv');
% disp('--- 2. フルパスでの読み込み ---');
% disp(M2);
% 3. ファイルを現在の作業ディレクトリに保存している場合 (sample_data.csvはヘッダーがあるので、このままではエラーになります)
% M3 = csvread('sample_data.csv'); % これを実行するとエラーが出ます(後述の解決策を参照)
解説
disp(M)
は、読み込まれた行列M
の内容をコンソールに表示します。csvread('filename.csv')
は、指定されたCSVファイルの内容全体を数値行列として読み込みます。
特定の行から読み込みを開始する(ヘッダー行のスキップ)
CSVファイルにヘッダー行がある場合、それをスキップして数値データだけを読み込みたいことが多いです。csvread
の第2引数R1
(開始行のオフセット)を使用します。オフセットは0から始まります。
% sample_data.csv は最初の1行がヘッダーなので、0行目をスキップするため1を指定します。
% R1=1 は「2行目から読み込みを開始する」を意味します。
M4 = csvread('sample_data.csv', 1, 0);
disp('--- 2. ヘッダー行をスキップ (sample_data.csv) ---');
disp(M4);
解説
- 上記の例では、
R1=1
なので、ファイルの2行目(オフセット1)から読み込みを開始し、最初の列(オフセット0)から読み込みます。 csvread('filename.csv', R1, C1)
:R1
は読み込みを開始する行のオフセット(0から始まる)、C1
は読み込みを開始する列のオフセット(0から始まる)です。
特定の範囲のデータのみを読み込む
ファイルの一部だけが必要な場合、開始行/列と終了行/列を指定して読み込むことができます。これは、大きなファイルから特定のサブセットを抽出したい場合に便利です。
% sample_data.csv から、2行目から3行目まで、2列目から3列目までを読み込む例
% オフセット: R1=1 (2行目), C1=1 (2列目)
% 終了オフセット: R2=2 (3行目), C2=2 (3列目)
M5 = csvread('sample_data.csv', 1, 1, [1 1 2 2]);
disp('--- 3. 特定の範囲を読み込む (sample_data.csv) ---');
disp(M5);
% no_header_data.csv から、1行目から2行目まで、1列目から2列目までを読み込む例
% オフセット: R1=0 (1行目), C1=0 (1列目)
% 終了オフセット: R2=1 (2行目), C2=1 (2列目)
M6 = csvread('no_header_data.csv', 0, 0, [0 0 1 1]);
disp('--- 3.2 特定の範囲を読み込む (no_header_data.csv) ---');
disp(M6);
解説
- オフセットが0から始まることを忘れないでください。
csvread('filename.csv', R1, C1, [R1 C1 R2 C2])
は、指定された矩形範囲のデータのみを読み込みます。- 最初の
R1
,C1
は、読み込みを開始する最初のセルを示します。 [R1 C1 R2 C2]
は、読み込む範囲の左上のセル(R1
,C1
)と右下のセル(R2
,C2
)のオフセットを指定します。
- 最初の
csvread
はシンプルですが、以下のような制限があります。
- パフォーマンス: 大量のファイルを読み込む際には、
dlmread
やreadmatrix
の方が高速な場合があります。 - 数値データのみ: ファイルにテキストや日付、欠損値を示す文字列(例: "NA")が含まれている場合、エラーになったり、データが正しく読み込まれなかったりします。
これらの制限を克服するために、Octaveではより強力で柔軟な関数が推奨されます。
dlmreadの使用(csvreadが内部的に使用)
dlmread
はcsvread
のより汎用的なバージョンで、任意の区切り文字(カンマ以外)を指定できます。
% ヘッダーなしのファイルの場合
M7 = dlmread('no_header_data.csv', ',');
disp('--- 4.1 dlmread を使用 (no_header_data.csv) ---');
disp(M7);
% ヘッダーありのファイルでヘッダーをスキップする場合
% (dlmreadの'R1', 'C1'引数はcsvreadと同じです)
M8 = dlmread('sample_data.csv', ',', 1, 0);
disp('--- 4.2 dlmread でヘッダーをスキップ (sample_data.csv) ---');
disp(M8);
解説
dlmread('filename.csv', delimiter, R1, C1)
:delimiter
で区切り文字を指定します。CSVの場合は,
です。
readmatrixの使用(最も推奨される)
Octaveの最近のバージョン(MATLABに準拠)では、readmatrix
関数がデータインポートの主要な関数として推奨されています。これは、CSVだけでなく、さまざまな形式のファイルを読み込むことができ、テキストデータや欠損値の処理にも優れています。
sample_data_with_text.csv
を作成してください。
Name,Value1,Value2
Apple,10,20
Banana,NA,25
Cherry,15,30
% テキストと数値が混在するファイルを読み込む
% (csvreadではエラーになるか、NaNになる可能性が高い)
try
M_text = csvread('sample_data_with_text.csv', 1, 1); % R1=1, C1=1 でName列とヘッダーをスキップ
disp('--- 4.3 csvreadでテキスト含むファイルを無理やり読み込み (NaNになる可能性) ---');
disp(M_text);
catch ME
disp(['--- 4.3 csvreadでテキスト含むファイルの読み込みエラー ---']);
disp(ME.message);
end
% readmatrixを使うと、もっと柔軟に読み込めます
% readmatrixはデフォルトでテーブルとして読み込みます。
% 数値行列として欲しい場合は、適切なオプションを指定する必要があります。
% OctaveのreadmatrixはMATLABのreadmatrixと完全に同じ機能ではない場合があります。
% 単純な数値データであれば、readmatrixはそのまま行列を返します。
% ヘッダーをスキップしたい場合は、`HeaderLines`オプションを使います。
% オプションの指定方法はOctaveのバージョンによって異なる場合があります。
% 数値部分だけを読み込む(ヘッダーと最初のテキスト列をスキップ)
% Octave 7.x 以降では、`readmatrix`はテキストを自動的にスキップしようとします。
% ただし、具体的に数値部分だけを抽出するオプションはMATLABほど豊富でない場合があります。
% 一般的には、`readtable`でテーブルとして読み込み、必要な列を抽出する方が堅牢です。
% より堅牢な方法:readtableを使ってテーブルとして読み込み、数値列を抽出する
T_data = readtable('sample_data_with_text.csv');
disp('--- 4.4 readtable でテーブルとして読み込み (sample_data_with_text.csv) ---');
disp(T_data);
% テーブルから特定の数値列を抽出
Value1_col = T_data.Value1;
Value2_col = T_data.Value2;
disp('--- 4.4.1 readtableから数値列を抽出 ---');
disp('Value1:');
disp(Value1_col);
disp('Value2:');
disp(Value2_col);
% 欠損値(NA)の処理も自動的に行われます(NaNになる)
readtable
は、CSVファイルをテーブルとして読み込み、列名を基にデータにアクセスできるため、非常に便利です。特に、ヘッダーがあり、数値とテキストが混在するファイルに適しています。readmatrix
は、ファイルの内容を解析し、自動的にデータ型を推測して読み込みます。テキストデータが含まれていても、適切に処理を試みます。
csvread
の代替方法
dlmread
関数readmatrix
関数readtable
関数textscan
とfopen
/fgetl
の組み合わせ
dlmread 関数
csvread
は内部的にdlmread
を呼び出しています。dlmread
はcsvread
よりも多くのオプションを提供するため、より柔軟なCSV読み込みが可能です。
特徴
- 範囲指定
特定の矩形範囲のデータのみを読み込むことができます。 - 開始行・列の指定
csvread
と同様に、読み込みを開始する行と列のオフセットを指定できます。 - 区切り文字の指定
カンマ以外の任意の区切り文字(タブ、セミコロンなど)を指定できます。
利点
csvread
より少しだけ柔軟性がある。- 異なる区切り文字のファイルにも対応できる。
csvread
とほぼ同じ構文で使用できる。
欠点
- エンコーディングの問題
エンコーディングの指定ができないか、限定的です。 - 数値データのみ
csvread
と同様に、基本的には数値データのみを読み込むことを想定しています。テキストデータが含まれているとエラーになるか、正しく読み込めません。
使用例
% ヘッダーなしのCSVファイル
% no_header_data.csv:
% 1,2,3
% 4,5,6
M1 = dlmread('no_header_data.csv', ',');
disp('--- dlmread (基本) ---');
disp(M1);
% ヘッダーをスキップするCSVファイル
% sample_data.csv:
% Header1,Header2,Header3
% 10,20,30
% 11,21,31
M2 = dlmread('sample_data.csv', ',', 1, 0); % 1行目(オフセット1)から読み込み開始
disp('--- dlmread (ヘッダーをスキップ) ---');
disp(M2);
readmatrix 関数
Octaveの最近のバージョン(MATLABに準拠)で推奨されている関数です。CSVファイルから数値データを読み込むための、より強力でインテリジェントな方法です。
特徴
- パフォーマンス
大規模なファイルを効率的に読み込むことができます。 - 欠損値の処理
空のセルや特定の文字列(例: "NA")をNaN
(Not a Number)として処理できます。 - ヘッダーの自動処理
デフォルトでヘッダー行をスキップする機能があります。 - 自動検出
データ形式(数値、テキストなど)を自動的に検出しようとします。
利点
- コードがシンプルになりやすい。
csvread
やdlmread
よりも堅牢でエラーに強い。- 最も推奨される数値データ読み込み方法。
欠点
- 読み込みたいのが純粋な数値行列ではなく、数値とテキストが混在する複雑なデータの場合は、次に説明する
readtable
の方が適しています。 - Octaveのバージョンによっては利用できない場合がある(特に古いバージョン)。
使用例
% readmatrixはデフォルトでヘッダーをスキップしようとします。
% sample_data.csv:
% Header1,Header2,Header3
% 10,20,30
% 11,21,31
M3 = readmatrix('sample_data.csv');
disp('--- readmatrix (ヘッダー自動スキップ) ---');
disp(M3);
% テキストや欠損値を含むファイル (例: data_with_text_and_na.csv)
% ColA,ColB,ColC
% 1,Apple,100
% 2,Banana,NA
% 3,Cherry,200
% readmatrix はテキスト列をスキップし、NAをNaNとして扱おうとします。
% Octaveのreadmatrixは、MATLABのreadmatrixのように詳細なオプション(例:`TreatAsMissing`)が常に利用できるわけではないので、注意が必要です。
% しかし、多くのケースで、テキスト部分を無視して数値部分を読み込むことができます。
try
M4 = readmatrix('data_with_text_and_na.csv');
disp('--- readmatrix (テキストとNAを含む) ---');
disp(M4); % ColAとColCが読み込まれ、NAがNaNになるはず
catch ME
disp(['--- readmatrix (エラーまたは予期せぬ動作) ---']);
disp(ME.message);
disp('readmatrixの挙動はOctaveのバージョンに依存します。');
disp('より堅牢な処理にはreadtableの利用を検討してください。');
end
readtable 関数
CSVファイルを「テーブル」というデータ構造として読み込みます。これは、Excelのスプレッドシートのように、列ごとに異なるデータ型(数値、テキスト、日付など)を持つデータを扱う場合に非常に強力です。
特徴
- 高度なオプション
Delimiter
、HeaderLines
、TreatAsMissing
、VariableNames
など、非常に多くのオプションで読み込みを制御できます。 - 欠損値の処理
欠損値を自動的に認識し、適切な形式(数値の場合はNaN
、文字列の場合は""
や<missing>
)で処理します。 - 列名でのアクセス
ヘッダー行を列名として使用し、列名でデータにアクセスできます(例:T.ColumnName
)。 - 複合データ型のサポート
各列が異なるデータ型(double
,string
,datetime
など)を持つことができます。
利点
- データ整理と操作が容易になる(列名でアクセスできるため)。
- 数値とテキストが混在するCSVファイルに最適。
- 最も柔軟で堅牢なデータインポート方法。
欠点
- テーブル操作に慣れる必要がある。
- 読み込むのが純粋な数値行列だけの場合には、
readmatrix
やdlmread
よりもオーバーヘッドが大きい可能性がある。
使用例
complex_data.csv
ID,ProductName,Quantity,Price,OrderDate
1,Apple,10,1.50,2023-01-01
2,Banana,5,NA,2023-01-02
3,Cherry,12,2.00,2023-01-03
4,Orange,8,1.75,2023-01-04
T1 = readtable('complex_data.csv');
disp('--- readtable (基本) ---');
disp(T1);
% 列名でデータにアクセス
disp('--- readtable (列名でアクセス) ---');
disp(['Product Names: ', T1.ProductName]);
disp(['Quantities: ', num2str(T1.Quantity')]); % num2strで表示を整形
% 欠損値(NA)はNaNとして処理されます
disp('--- readtable (Price列 - NAをNaNとして処理) ---');
disp(T1.Price);
これは最も低レベルな読み込み方法ですが、最も高度なカスタマイズが可能です。CSVファイルの構造が非常に複雑で、他の関数では対応できない場合に検討します。
特徴
- 部分的な読み込み
ファイルの特定のセクションだけを読み込むなど、非常に柔軟な処理が可能です。 - 任意の形式指定
読み込むデータの型(%f
で浮動小数点数、%s
で文字列など)を細かく指定できます。 - 行ごとの詳細な制御
ファイルを1行ずつ読み込み、各行のデータを個別に解析できます。
利点
- 他の関数では不可能な、非常に特殊なフォーマットのファイルにも対応できる。
- 究極の柔軟性。
欠点
- エラー処理を自分で記述する必要がある。
- パフォーマンスが遅くなる可能性がある(特に大規模なファイルの場合)。
- コードが複雑になりやすい。
% complex_data.csv の例を使用
% 最初の行(ヘッダー)をスキップし、残りのデータを読み込む
% ID(数値), ProductName(文字列), Quantity(数値), Price(数値), OrderDate(文字列)
fid = fopen('complex_data.csv', 'r');
if fid == -1
error('ファイルが開けません。');
end
% ヘッダー行を読み飛ばす
fgetl(fid);
% データのフォーマット指定
% %f: float, %s: string, %q: string (quoted string), %*s: skip string
fmt = '%f%q%f%f%s';
% データを読み込む
% 'Delimiter', ',' : カンマ区切り
% 'EndOfLine', '\n' : 改行コード
% 'CollectOutput', 1 : 同じ型の列をまとめて行列にする (Octave 7.x 以降では不要な場合あり)
C = textscan(fid, fmt, 'Delimiter', ',', 'EndOfLine', '\n');
fclose(fid);
% 読み込まれたデータを個々の変数に格納
ID = C{1};
ProductName = C{2};
Quantity = C{3};
Price = C{4};
OrderDate = C{5};
disp('--- textscan で読み込み ---');
disp('ID:'); disp(ID);
disp('Product Names:'); disp(ProductName);
disp('Quantities:'); disp(Quantity);
disp('Prices:'); disp(Price);
disp('Order Dates:'); disp(OrderDate);
% Price列のNAをNaNとして処理する例(textscan後の手動処理)
% Priceデータに文字列 'NA' が含まれている場合、textscanはそれを数値として読み込めないので、
% ここではPrice列を文字列として読み込み、後で変換するなどの工夫が必要になる。
% 上記の例ではPriceを%fで読み込もうとするため、'NA'があるとエラーになる可能性があります。
% このような場合は、Priceも%qで読み込み、後でstr2doubleで変換し、NaNを処理する、といったロジックが必要です。
- 非常に複雑なCSVフォーマット
textscan
とfopen
/fgetl
(最終手段) - 数値とテキストが混在するCSV (ヘッダーあり)
readtable
(最も推奨) - 数値CSV (ヘッダーあり)
readmatrix
(推奨) またはdlmread
(ヘッダー行スキップオプション付き) - 簡単な数値CSV (ヘッダーなし)
csvread
またはdlmread