filesが自動的に更新されてしまう

3 views (last 30 days)
創 尾崎
創 尾崎 on 25 Aug 2021
Commented: 創 尾崎 on 2 Sep 2021
下記のコードは、"kyousei_c"で始まるmatファイルを読み込み、同じ名前でエクセルに保存するものなのですが、
ちょうど#の境目のところで、files がある特定の名前に勝手に置き変わってしまい、
結果としてfor文で回しても毎回その名前のエクセルファイルにデータが書き込まれてしまうという現象が起きています。
###load までの正しい files(correct_files)、###filename からの誤っているfiles(incorrect_files)を添付しました。
なぜ勝手に files が改ざんされてしまうのか、原因が分かる方がいたら教えていただきたいです。
よろしくお願いいたします。
%ファイルの取り込み
files = what; % 現在のフォルダ内のMATLABファイル一覧を取得
for i = 1:length(files.mat)
if regexp(files.mat{i},'^kyousei_c') % matファイル名が"kyousei_c"で始まるかどうか判定
###load(files.mat{i}); % matファイル名が"kyousei_c"で始まるものを読込
###filename = strrep(files.mat{i},'.mat','.xlsx');
writecell({'T','X','V'},filename,'Sheet',1,'Range','A1');
writematrix(T,filename,'Sheet',1,'Range','A2'); %matファイル内の変数Tを一列目に保存%
writematrix(X,filename,'Sheet',1,'Range','B2'); %matファイル内の変数Xを二列目に保存%
writematrix(V,filename,'Sheet',1,'Range','C2'); %matファイル内の変数Vを二列目に保存%
end
end

Answers (1)

Toru Ikegami
Toru Ikegami on 26 Aug 2021
こんにちは,
ひょっとして読み込む.mat ファイルの中に,変数 "files" が含まれていると言うことはありませんか?(含まれていなければ以下の記述は見当違いですので無視してください.)
関数 load をファイル名のみを指定して呼び出すと,ファイルに含まれている全ての変数が読み込まれるので,期せずして既存の変数を置き換えてしまうことがあります.これを避けるには次のような方法があります.
  1. ファイルをロードするときに,ロードしたデータを構造体変数に代入する.
  2. 指定した変数のみをロードする
1番目の例ですと,
files = what;
for i = 1:length(files.mat)
if regexp(files.mat{i},'^kyousei_c') % matファイル名が"kyousei_c"で始まるかどうか判定
data = load(files.mat{i}); % ファイルの中の変数を構造体のフィールドとして受けます
% ファイル中の変数は,構造体dataのフィールド(名前は変数名と
% 同じ)になります.
filename = strrep(files.mat{i},'.mat','.xlsx');
writecell({'T','X','V'},filename,'Sheet',1,'Range','A1');
writematrix(data.T,filename,'Sheet',1,'Range','A2'); %matファイル内の変数Tを一列目に保存%
writematrix(data.X,filename,'Sheet',1,'Range','B2'); %matファイル内の変数Xを二列目に保存%
writematrix(data.V,filename,'Sheet',1,'Range','C2'); %matファイル内の変数Vを二列目に保存%
end
end
2番目の例ですと
for i = 1:length(files.mat)
if regexp(files.mat{i},'^kyousei_c') % matファイル名が"kyousei_c"で始まるかどうか判定
load(files.mat{i},'T','X','V'); % matファイルに含まれる変数 'T','X','V'のみをロードします.
filename = strrep(files.mat{i},'.mat','.xlsx');
writecell({'T','X','V'},filename,'Sheet',1,'Range','A1');
writematrix(T,filename,'Sheet',1,'Range','A2'); %matファイル内の変数Tを一列目に保存%
writematrix(X,filename,'Sheet',1,'Range','B2'); %matファイル内の変数Xを二列目に保存%
writematrix(V,filename,'Sheet',1,'Range','C2'); %matファイル内の変数Vを二列目に保存%
end
end
となります.
  1 Comment
創 尾崎
創 尾崎 on 2 Sep 2021
ありがとうございます!
理解しました!

Sign in to comment.

Tags

Community Treasure Hunt

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

Start Hunting!