連続しない番号での繰り返し計算
3 次查看(过去 30 天)
显示 更早的评论
フォルダに V(1).csv、V(6).csv、V(8).csv、V(20).csv とcsvファイルが入っているとします。
ここで
for i = 1:20
A = csvread(V(i).csv);
B = csvread(V(i+1).csv);
B - A;
end
としてもcsvファイルのかっこの番号が連続していないので、もちろんエラーになります。
そこで、フォルダに入っている隣の番号同士で計算をしたいです。
例えば上記の例だと、
V(6).csv - V(1).csv;
V(8).csv - V(6).csv;
V(20).csv - V(8).csv;
というようにしたいです。
また、隣の番号同士で計算をするときに、その番号の差を記録したいです。
例えば上記の例だと、
V(6).csv - V(1).csv;であれば差は5
V(8).csv - V(6).csv;であれば差は2
V(20).csv - V(8).csv;であれば差は12
というようにしたいです。
以上、2つの事柄についてどのようにスクリプトを作成すればよいか教えていただきたいです。
0 个评论
采纳的回答
交感神経優位なあかべぇ
2022-11-14
一番大きい値が20と分かっているならば、下記でどうでしょうか?
diffCsvList = {};% A - Bを行った答えを格納する変数
diffNumList = [];% 番号の差分を格納する変数
data_prev = [];
for i = 20 : -1 : 1
fileName = ['V(', num2str(i), ').csv'];
if isfile(fileName)
data = csvread(fileName);
if ~isempty(data_prev)
diffCsvList{end + 1, 1} = data_prev - data;
diffNumList(end + 1, 1) = i_prev - i;
end
data_prev = data;
i_prev = i;
end
end
一番大きな番号が分からないのであれば、下記はいかがでしょうか?
files = dir('*.csv');
fileNames = {files.name};% 現在のフォルダにある.csvのファイル名を取得する。
numberCell = regexp(fileNames, '^V((\d+))\.csv$', 'once', 'tokens');%V(番号).csvの番号を抽出する。
isVFile = cellfun(@(x) ~isempty(x), numberCell);
numberCell(~isVFile) = '';%V(番号).csv名以外のファイルがあった場合、それを除外する。
numberStr = cellfun(@(x) x, numberCell);
number = str2double(numberStr);
sortNumber = sort(number, 'descend');% 番号を降順にする。
diffCsvList = cell(length(sortNumber) - 1, 1);% A - Bを行った答えを格納する変数
diffNumList = zeros(length(sortNumber) - 1, 1);% 番号の差分を格納する変数
csvData1 = csvread(['V(', num2str(sortNumber(1)), ').csv']);
for i = 2 : length(sortNumber)
csvData2 = csvread(['V(', num2str(sortNumber(i)), ').csv']);
diffCsvList{i - 1} = csvData1 - csvData2;
diffNumList(i - 1) = sortNumber(i - 1) - sortNumber(i);
csvData1 = csvData2;
end
2 个评论
Atsushi Ueno
2022-11-14
编辑:Atsushi Ueno
2022-11-14
私もやってみましたが、@交感神経優位なあかべぇさんの後半に近いです。難点はファイル名に全角文字が散在している事です。前半も良くてtry catchも使いたい所ですが、やはり後半の方が個人的に好みです。
writematrix(rand(10),'V(1).csv'); % サンプルファイル作成
writematrix(rand(10),'V(6).csv'); % サンプルファイル作成
writematrix(rand(10),'V(8).csv'); % サンプルファイル作成
writematrix(rand(10),'V(20).csv'); % サンプルファイル作成
ls -la
csv_file_list = tabularTextDatastore(pwd,"FileExtensions",".csv"); % カレントフォルダのCSVファイル情報を得る
nums = regexp(csv_file_list.Files,'[VV][((](\d+|[0-9]+)[))].csv$','tokens'); % ファイル名から数字を抽出する
nums = [nums{:}]; % おまじない
nums = [nums{:}]; % おまじない
nums = replace(nums,{'0','1','2','3','4','5','6','7','8','9'}, ...
{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}); % 全角⇒半角
nums = cellfun(@str2num,nums) % 文字⇒数値
diffs = diff(sort(nums)) % ソートして差分を計算
V(6).csv - V(1).csv;であれば差は5
V(8).csv - V(6).csv;であれば差は2
V(20).csv - V(8).csv;であれば差は12
更多回答(1 个)
Kenji Nakayama
2022-11-14
n(1)=1,n(2)=6,n(3)=8,n(4)=20として,
for i = 1:3
A = csvread(V(n(i)).csv);
B = csvread(V(n(i+1)).csv);
B - A;
end
としてはどうでしょうか.
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!