Excelからのデー​タの読み込みと書き出​しの速度を速くするに​はどうしたらいいです​か?

ある計測器の出力データが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 Comments

michio
michio on 6 Jul 2017
Edited: michio on 6 Jul 2017
3つの処理を書いていただいていますが、どの処理が最も時間かかっていますか? (添付キャプチャ写真で示している「実行および時間の計測」機能で確認できます。)

Sign in to comment.

 Accepted Answer

michio
michio on 6 Jul 2017
Edited: michio on 6 Jul 2017

3 votes

xlsread/xlswrite 関数は R2015b で繰り返し実行の際のパフォーマンスが改善されています。もし R2015a 以前のバージョンを使用されている場合は、是非バージョンアップを。
他にも、 readtable 関数 も有効かもしれません。
また提示のコードでは、1シートに100フレームのデータを、100回に分けて xlsread関数で読み取っているようですが、例えば一度に100フレーム分読み取ったあとで個別に処理をするなど、読み取り回数を減らすことでも高速化が望めそうです。
上記以外でも、ユーザコミュニティである MATLAB Central/File Exchange において、xlswrite 関数の高速化を図ったコードがいくつか紹介されていますので、試してみてください。

5 Comments

Yumi Iwakami
Yumi Iwakami on 6 Jul 2017
コメントありがとうございます.
MATLABのバージョンはR2017aですのでxlsreadは試してみます.
1シートをまるごと読み取って個別に処理することも考えたのですが,ヘッダー等文字列やフレームの間に3行スペースが入ってしまっているため,難しいと考えました.
現状の処理では1日に数人しか切り出せないため,打開策を考えてみます.
michio
michio on 6 Jul 2017
Edited: michio on 6 Jul 2017
各フレーム(35×35の数値データ)の間に空白の行が存在するようでしたら、
mat=xlsread(inputfilename,sheet);
とシート全体を読み込んだ場合に、NaNが空白の位置に入った行列として読み込まれると思います。その後、すでに実施されている「切り抜き範囲の設定」で行列の範囲を指定すれば、個別に処理ができるのかなと考えていました。
Jiro Doke
Jiro Doke on 6 Jul 2017
Michioさんが仰っている通り、せめて1シートに対して1回だけ xlsread を使うのをお勧めします。100フレーム × 8 シート × ファイル数の回数 xlsread を呼ぶのは非常に遅くなります。
Jiro Doke
Jiro Doke on 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
Yumi Iwakami
Yumi Iwakami on 13 Jul 2017
ありがとうございます!うまくいきました

Sign in to comment.

More Answers (1)

mizuki
mizuki on 6 Jul 2017

3 votes

Excelファイルのすべての列ではなく特定列だけであれば、 datastoreや並列計算を組み合わせたらさらに高速化できる可能性があります。
ただし、Michioさんのご提案された基本的な内容をお試しされた後にご検討ください。

Products

Community Treasure Hunt

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

Start Hunting!