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

조회 수: 75 (최근 30일)
Yumi Iwakami
Yumi Iwakami 2017년 7월 6일
댓글: Yumi Iwakami 2017년 7월 13일
ある計測器の出力データが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
michio
michio 2017년 7월 6일
편집: michio 2017년 7월 6일
3つの処理を書いていただいていますが、どの処理が最も時間かかっていますか? (添付キャプチャ写真で示している「実行および時間の計測」機能で確認できます。)
michio
michio 2017년 7월 12일

댓글을 달려면 로그인하십시오.

채택된 답변

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

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

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

제품

Community Treasure Hunt

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

Start Hunting!