Excelからのデータの読み込みと書き出しの速度を速くするにはどうしたらいいですか?
72 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Yumi Iwakami
am 6 Jul. 2017
Kommentiert: Yumi Iwakami
am 13 Jul. 2017
ある計測器の出力データがExcelで出力されます. 1フレーム35×35の数値データで1シートに100フレームのデータが入っており,それが8シートぐらいあります.(ファイルごとにシートの枚数は異なります) ここから繰り返し処理を使って1フレームずつのcsv形式のデータに出力しているのですが,1つのファイルを処理するのに何時間もかかってしまいます.コードは以下のような形で書いていますが処理を速くする方法があったら教えてください.
%切り抜き範囲の設定
xlrange=strcat(start_col,num2str(start_row),':',end_col,num2str(end_row));
%切り抜き
mat=xlsread(inputfilename,sheet,xlrange);
%csvで書き出し
dlmwrite(outputfilename,mat);
2 Kommentare
Akzeptierte Antwort
michio
am 6 Jul. 2017
Bearbeitet: michio
am 6 Jul. 2017
xlsread/xlswrite 関数は R2015b で繰り返し実行の際のパフォーマンスが改善されています。もし R2015a 以前のバージョンを使用されている場合は、是非バージョンアップを。
また提示のコードでは、1シートに100フレームのデータを、100回に分けて xlsread関数で読み取っているようですが、例えば一度に100フレーム分読み取ったあとで個別に処理をするなど、読み取り回数を減らすことでも高速化が望めそうです。
上記以外でも、ユーザコミュニティである MATLAB Central/File Exchange において、xlswrite 関数の高速化を図ったコードがいくつか紹介されていますので、試してみてください。
MATLAB Central: File Exchange https://jp.mathworks.com/matlabcentral/fileexchange/?utf8=%E2%9C%93&term=xlswrite+fast
5 Kommentare
Jiro Doke
am 7 Jul. 2017
こんな感じでできるかと思います。
data = xlsread('test.xls'); % フレーム間の空行は NaN で入ってくる
startID = 1:38:size(data,1); % フレームは 35 行でフレーム間は 3 行とする
endID = 35:38:size(data,1);
for iF = 1:length(startID)
mat = data(startID(iF):endID(iF),:);
csvwrite(sprintf('data%02d.csv',iF),mat)
end
Weitere Antworten (1)
mizuki
am 6 Jul. 2017
Excelファイルのすべての列ではなく特定列だけであれば、 datastoreや並列計算を組み合わせたらさらに高速化できる可能性があります。
ただし、Michioさんのご提案された基本的な内容をお試しされた後にご検討ください。
0 Kommentare
Siehe auch
Kategorien
Mehr zu スプレッドシート finden Sie in Help Center und File Exchange
Produkte
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!