連続しない番号での繰り返し計算

9 次查看(过去 30 天)
雅晶
雅晶 2022-11-14
评论: 雅晶 2022-11-15
フォルダに 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つの事柄についてどのようにスクリプトを作成すればよいか教えていただきたいです。

采纳的回答

交感神経優位なあかべぇ
一番大きい値が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
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
total 24 drwxr-xr-x 2 mluser worker 4096 Nov 14 15:04 . drwx------ 1 mluser worker 4096 Nov 14 15:04 .. -rw-r--r-- 1 mluser worker 1798 Nov 14 15:04 V(1).csv -rw-r--r-- 1 mluser worker 1801 Nov 14 15:04 V(20).csv -rw-r--r-- 1 mluser worker 1795 Nov 14 15:04 V(8).csv -rw-r--r-- 1 mluser worker 1796 Nov 14 15:04 V(6).csv
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) % 文字⇒数値
nums = 1×4
1 20 6 8
diffs = diff(sort(nums)) % ソートして差分を計算
diffs = 1×3
5 2 12
V(6).csv - V1.csv;であれば差は5
V(8).csv - V6.csv;であれば差は2
V20.csv - V(8).csv;であれば差は12
雅晶
雅晶 2022-11-15
参考になりました。
ありがとうございます。

请先登录,再进行评论。

更多回答(1 个)

Kenji Nakayama
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
としてはどうでしょうか.
  1 个评论
雅晶
雅晶 2022-11-15
回答していただきありがとうございます。
参考にさせていただきます。

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 起動と終了 的更多信息

标签

产品


版本

R2022b

Community Treasure Hunt

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

Start Hunting!