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

27 views (last 30 days)
Kohei Yoshino
Kohei Yoshino on 27 Mar 2024
Commented: Kohei Yoshino on 29 Mar 2024 at 15:32
% 現在のフォルダ内にある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しか格納されないのはなぜでしょうか?

Accepted Answer

Kojiro Saito
Kojiro Saito on 27 Mar 2024
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 Comments
Kojiro Saito
Kojiro Saito on 29 Mar 2024
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 on 29 Mar 2024 at 15:32
返信が遅くなりすみません。おかげさまで解決しました。ありがとうございます。今後用語の理解も深めてまいります。

Sign in to comment.

More Answers (0)

Tags

Products


Release

R2023b

Community Treasure Hunt

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

Start Hunting!