連続しない番号での繰り返し計算
15 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
フォルダに 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 commentaires
Réponse acceptée
交感神経優位なあかべぇ
le 14 Nov 2022
一番大きい値が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 commentaires
Atsushi Ueno
le 14 Nov 2022
Modifié(e) : Atsushi Ueno
le 14 Nov 2022
私もやってみましたが、@交感神経優位なあかべぇさんの後半に近いです。難点はファイル名に全角文字が散在している事です。前半も良くて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
Plus de réponses (1)
Kenji Nakayama
le 14 Nov 2022
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
としてはどうでしょうか.
Voir également
Catégories
En savoir plus sur 対話型コントロールとコールバック dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!