for文を使用して、​現在のフォルダ内にあ​る3つのcsvファイ​ルを1つのリスト型と​して格納するにはどう​すれば良いですか?

% 現在のフォルダ内にある3つのcsvを抽出
Pathlists = dir("*.csv");
% 抽出したcsv構造をセルに変換
Mylists = (struct2cell(Pathlists))';
% 全行と1列目、2列目を文字列として抽出
Mylists = string(Mylists(:,1:2));
% 完全なファイル仕様に変換
MyPath = fullfile(Mylists(:,2),Mylists(:,1));
% 空リストを作成し、以下のようなデータ型を作成したい
% data = [[file1], [file2], [file3]] 各データの値1801×11 table
data = []; % 空リスト
for n = 1:length(Pathlists)
data = readtable(MyPath(n));
end
>> data % file3のtableしか格納されないのはなぜでしょうか?

 採用された回答

Kojiro Saito
Kojiro Saito 2024 年 3 月 27 日

1 投票

file3のtableしか格納されないのは、forループごとにdata変数が上書きされて最後のn=3の場合のものしか残らないためです。
1つのリスト型にしたいというのが、テーブルを縦に連結するという意味でしたら、forの中を
data = vertcat(data, readtable(MyPath(n)));
または
data = [data; readtable(MyPath(n))];
とすることで3つのテーブルが連結されます。
datastoreを使って、forループを使わないで実現する方法もあります。
% 現在のフォルダ内にある3つのcsvを抽出
ds = datastore("*.csv");
data = readall(ds);

3 件のコメント

Kohei Yoshino
Kohei Yoshino 2024 年 3 月 28 日
Kojiro Saitoさん
早急のご回答ありがとうございます。ご提示いただいたコードを実行させていただきましたが、自分の説明不足もあり違う出力結果となってしまいました。
3つのcsvファイルはいずれもVariableNamesが同一で、連結させるというよりはそれぞれのcsvファイルを独立した状態で読み込みたいです。
data = readtable(MyPath(n));
data(1); data(2); data(3); %data(1)には一つ目のcsvファイルが、data(2)には2つ目のファイルが呼び出せるようにしたい
Kojiro Saito
Kojiro Saito 2024 年 3 月 29 日
dataの要素に各CSVのテーブルデータを格納したいということですね。
dataをセル配列にして、各要素に入れてみてください。
data = cell(1, length(Pathlists)); % 事前割当
for n = 1:length(Pathlists)
data{n} = readtable(MyPath(n));
end
% data{1}、data{2}、data{3} がテーブルデータ
% data(1)、data(2)、data(3) がセル配列
% として格納されます
Kohei Yoshino
Kohei Yoshino 2024 年 3 月 29 日
返信が遅くなりすみません。おかげさまで解決しました。ありがとうございます。今後用語の理解も深めてまいります。

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

ヘルプ センター および File ExchangeData Import from MATLAB についてさらに検索

製品

リリース

R2023b

タグ

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!