csvファイルを全て読み込み、配列を合わせる

41 views (last 30 days)
Ochi Kai
Ochi Kai on 26 Aug 2022
Answered: Ochi Kai on 2 Sep 2022
例えばカレントディレクトリ内に3つのcsvファイルA.csv、B.csv、C.csvがあり、
A = [1 2 3]、B=[2 4 6 8 10]、C=[1 3 5 7 9 11]等のようにそれぞれ違う配列数のデータがあるとします。(行数は同じだが、列数が異なる)
これら全てを読み込み、なおかつ
A = [1 2 3]、B=[2 4 6 ]、C=[1 3 5 ]のように要素数を最小のものに合わせる様にはどのようにすればよろしいでしょうか?よろしくお願いいたします。
  1 Comment
Ochi Kai
Ochi Kai on 26 Aug 2022
すいません、少し条件を変更させてください。。。
A = [0 0 0, 1 2 3]、B=[0 0 0 0 0 , 2 4 6 8 10]、C=[0 0 0 0 0 0, 1 3 5 7 9 11]を
A = [1 2 3]、B=[2 4 6 ]、C=[1 3 5 ]のように
2行目を抜き取り、かつ要素数を合わせたいです。

Sign in to comment.

Accepted Answer

Hernia Baby
Hernia Baby on 26 Aug 2022
■ディレクトリ内のcsvを一気に読み込みます
files = dir('*.csv');
for ii = 1:length(files)
X{ii} = readmatrix(files(ii).name);
end
■読み込んだデータは以下のようになっています
A = [0 0 0; 1 2 3]';
B = [0 0 0 0 0; 2 4 6 8 10]';
C = [0 0 0 0 0 0; 1 3 5 7 9 11]';
X = {A,B,C}
X = 1×3 cell array
{3×2 double} {5×2 double} {6×2 double}
cell型なのでcellfunを使ってまとめて処理していきましょう
・まずは2行目だけを抜き取ります
X = cellfun(@(x) x(:,2),X,'UniformOutput',false)
X = 1×3 cell array
{3×1 double} {5×1 double} {6×1 double}
・次に最小のサイズを調べます
sz = min(cellfun(@height,X))
sz = 3
・最後にサイズを揃えます
X = cellfun(@(x) x(1:sz,1),X,'UniformOutput',false)
X = 1×3 cell array
{3×1 double} {3×1 double} {3×1 double}
・もし連結させたい場合はcell2matで合体させます
X = cell2mat(X)
X = 3×3
1 2 1 2 4 3 3 6 5
  5 Comments
Hernia Baby
Hernia Baby on 31 Aug 2022
ひとつずつ答えますね。
まずはデータを用意します。
A = [0 0 0; 1 2 3]';
B = [0 0 0 0 0; 2 4 6 8 10]';
C = [0 0 0 0 0 0; 1 3 5 7 9 11]';
X = {A,B,C};
X = cellfun(@(x) x(:,2),X,'UniformOutput',false);
sz = min(cellfun(@height,X));
X = cellfun(@(x) x(1:sz,1),X,'UniformOutput',false);
X0 = cell2mat(X);
■各変数の作り方
for ii = 1:length(X)
eval(sprintf('X%i = X{%i};',ii,ii))
end
who
Your variables are: A B C X X0 X1 X2 X3 cmdout ii sz
X1, X2, X3ができました。
■なぜ各変数にするとよくないか
 計算が一度にできないからです。
 例として、平均をとりたいとなったとしましょう。
・X : cellでそれぞれ格納した場合
cellfun(@mean,X)
ans = 1×3
2 4 3
・X0 : 行列の場合
mean(X0)
ans = 1×3
2 4 3
・X1, X2, X3 : 各変数の場合
mean([X1,X2,X3])
ans = 1×3
2 4 3
 上記のように変数を手動で増やしていかなければいけません。
 そのためコードを逐一変える必要があるのでお勧めできないのです。
{1×3 double} {1×3 double} {1×3 double}
 これもとらえ方次第だと思いますが、celltable のままで処理できます。
 行を縦に結合させたい場合は以下のようにします
Xt = cellfun(@transpose,X,'UniformOutput',false)
Xt = 1×3 cell array
{[1 2 3]} {[2 4 6]} {[1 3 5]}
①要素ごとに結合
Xtt = [];
for ii = 1:length(X)
Xtt = [Xtt;Xt{ii}]
end
Xtt = 1×3
1 2 3
Xtt = 2×3
1 2 3 2 4 6
Xtt = 3×3
1 2 3 2 4 6 1 3 5
cellfun×transposeを使う
 Xtと同じことをします
cell2mat(cellfun(@transpose,Xt,'UniformOutput',false))'
ans = 3×3
1 2 3 2 4 6 1 3 5

Sign in to comment.

More Answers (1)

Ochi Kai
Ochi Kai on 2 Sep 2022
とても丁寧に教えてくださり本当にありがとうございます。(´;ω;`)
またMATLAB環境を使える時が限られておりお返事が遅くなり申し訳ございませんでした。
この度は本当にありがとうございます。

Categories

Find more on table in Help Center and File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!