csvファイルまたはテキストファイルからデータを読み込みたい
279 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
question.csvのようなデータを読み込みたいです。
#❶ 文字列を含む読み込まなくて良い行が5行
#① その下に読み込みたい複数行
#❷ 空白の1行と文字列を含む読み込まなくて良い行が5行
#② その下に読み込みたい複数行
#❸ 空白の1行と文字列を含む読み込まなくて良い行が5行
#③ その下に読み込みたい複数行
のような内容で構成されており、①と②と③は独立しているため、別々で読み込みたいと考えています。
またquestion.csvは数十列で作成していますが、実際は行数が多く、読み込むcsvファイルにより行数も異なるため、
行数を指定して読み込むのが難しいです。
B = readmatrix('question.csv', 'NumHeaderLines',5) ;
のようにコードを書くと、最初の5行部分を取り除いた形でimportできるとこまでは理解できたのですが、
このように読み込んでしまうと、#①から#③までが繋がってしまうことや、#❷や#❸を取り除くことができません。
何か良い方法がありましたらご教示いただければと思います。
よろしくお願いします。
2 commentaires
Réponse acceptée
Hernia Baby
le 22 Mar 2022
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 commentaires
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur スプレッドシート dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!