特定の数字列を取り出す方法

7 views (last 30 days)
健気 大川
健気 大川 on 16 Sep 2021
Commented: 健気 大川 on 17 Sep 2021
イメージデータを画像で添付させて頂きました。
B列には0と1からなるマーク数列、c列には1から23までの数字があります。これをB列の1となっているところだけ、右のよう(E列以降)に取り出したいです。お時間がある方、助言を教えて頂きたいです。(ただし、実際のデータは1の文字列が何個あるのか分からないものとなっております。また、0と1の並び方は不規則です。)

Accepted Answer

Hernia Baby
Hernia Baby on 16 Sep 2021
まずは読み込みます
clear,clc;
A = readmatrix('Sample.xlsx');
■ここがミソ
unique 関数で一位の値をだし、それに該当する2列目の数字を取り出します
idx = unique(A(:,1))
idx = 2×1
0 1
B = A(A(:,1) == idx(2),2)
B = 13×1
3 4 5 7 8 9 13 14 16 17
E2以降に書き込みます
writematrix(B,'Sample.xlsx','Range','E2')
  5 Comments
Hernia Baby
Hernia Baby on 16 Sep 2021
1が単体で存在すると非常に難しいです
ここからここまでを抜き出すといった物はできるんですが、1が連続しないとなるとそれが通用しません
一応コードを書きましたので以下に示します
■読み込み
clear,clc;
file = 'Sample.xlsx';
A = readmatrix(file,"OutputType","double"');
■1のインデックスを抜き出す
[row,~,~] = find(A(:,1));
■1の開始と終了を抜き出す
idxs = [0; diff(row)] ~= 1;
idxs(end) = 1;
idxe = [diff(row); 0] ~=1;
idxe(end) = 0;
idx = logical(idxs + idxe);
■開始&終了をセットにする
row1 = reshape(row(idx),2,[])
row1 = 2×4
3 7 13 16 5 9 14 20
■1つずつ追加していく
 この時AZを超えるとエラーを吐き出す
for i = 1:length(row1(1,:))
chart = char('E' + 3*i);
if chart > 'Z'
chart = ['A', char('A' + chart - 'Z')];
end
if chart > 'AZ'
disp('分割数がAZより大きいです')
break
end
disp([chart,'2'])
writematrix(A(row1(1,i):row1(2,i),:),file,'Range',[chart,'2']);
end
H2 K2 N2 Q2
今回はQ2のセルにまで書くようになっています
もう一度言いますが、row1のセットができないので、
このコードでは1が単体で存在する場合はエラーを起こします
健気 大川
健気 大川 on 17 Sep 2021
ありがとうございます。1が単体で存在することなないので解決いたしました。
お忙しい中ありがとうございました。

Sign in to comment.

More Answers (0)

Tags

Community Treasure Hunt

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

Start Hunting!