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

조회 수: 8 (최근 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つの事柄についてどのようにスクリプトを作成すればよいか教えていただきたいです。

채택된 답변

交感神経優位なあかべぇ
交感神経優位なあかべぇ 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
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!