csvファイルまたはテキストファイルからデータを読み込みたい
147 次查看(过去 30 天)
显示 更早的评论
question.csvのようなデータを読み込みたいです。
#❶ 文字列を含む読み込まなくて良い行が5行
#① その下に読み込みたい複数行
#❷ 空白の1行と文字列を含む読み込まなくて良い行が5行
#② その下に読み込みたい複数行
#❸ 空白の1行と文字列を含む読み込まなくて良い行が5行
#③ その下に読み込みたい複数行
のような内容で構成されており、①と②と③は独立しているため、別々で読み込みたいと考えています。
またquestion.csvは数十列で作成していますが、実際は行数が多く、読み込むcsvファイルにより行数も異なるため、
行数を指定して読み込むのが難しいです。
B = readmatrix('question.csv', 'NumHeaderLines',5) ;
のようにコードを書くと、最初の5行部分を取り除いた形でimportできるとこまでは理解できたのですが、
このように読み込んでしまうと、#①から#③までが繋がってしまうことや、#❷や#❸を取り除くことができません。
何か良い方法がありましたらご教示いただければと思います。
よろしくお願いします。
采纳的回答
Hernia Baby
2022-3-22
2列目に余計な数字がないことを利用して抜き出します
■読み込み
clear,clc;
filepath = "question.csv";
question = readmatrix(filepath);
■indexを使う
2列目のNaN(文字や空欄)の判定をし、前後をひきます
すると始まりと終わりの部分だけがtrueになります
idx = isnan(question(:,2));
idx_or =[0;diff(idx)]<0|[diff(idx);0]>0;
disp(idx_or')
■行番号を見つける
find関数で行番号を見つけます
行番号の数が偶数でなければ最後の行がNaNで終わってない証拠です
最後の行番号を付け加えます
num = find(idx_or);
if mod(length(num),2)
num = [num;height(idx_or)];
end
行番号が書かれている変数 num の半分のサイズだけ繰り返し操作します
for ii = 1:length(num)/2
A{ii,1} = question(num(2*ii-1):num(2*ii),:);
end
cell型として A に各行列が入りましたがNaNの列が存在します
cellfunでまとめて消しましょう
B = cellfun(@(x) rmmissing(x,2),A,'UniformOutput',false);
これで求めたい行列を一つのcell型Bに格納できました
cellfun(@size,B,'UniformOutput',false)
5 个评论
更多回答(0 个)
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!