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

19 views (last 30 days)
雅晶
雅晶 on 14 Nov 2022
Commented: 雅晶 on 15 Nov 2022
フォルダに 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つの事柄についてどのようにスクリプトを作成すればよいか教えていただきたいです。

Accepted Answer

交感神経優位なあかべぇ
一番大きい値が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 Comments
Atsushi Ueno
Atsushi Ueno on 14 Nov 2022
Edited: Atsushi Ueno on 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
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
雅晶
雅晶 on 15 Nov 2022
参考になりました。
ありがとうございます。

Sign in to comment.

More Answers (1)

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

Sign in to comment.

Categories

Find more on 起動と終了 in Help Center and File Exchange

Tags

Products


Release

R2022b

Community Treasure Hunt

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

Start Hunting!