フォルダ内のファイル​を「1日分」読み込み​、グラフを作るには?

6 views (last 30 days)
nknknknk
nknknknk on 31 Jul 2017
Commented: nknknknk on 2 Aug 2017
以下のように一つのフォルダに1分ごとに作成されたファイルがあります。①
ファイル内のデータはテキストとバイナリデータが混在しています。② 簡単なデータ構造は下記に示します。③ データフォーマットはこちらです。
このフォルダ内のファイルを「1日分」読み込み、グラフを作成したいです。
下記のプログラムはエラーが出ます。③ また、下記プログラムはフォルダ内の全てのファイル読み込みになっているが、「1日分」指定して読み込む方法にしたいです。
以前の質問に補足しました。 一人で詰まってしまい大変困っています。よろしくお願い致します。
----①フォルダ内
  ファイル名      作成日時
e16A0319.272413 2016/10/03 19:26
e16A0319.272413 2016/10/03 19:27
----②一つのファイル内構造
e16A0319.272413
03/10/2016 19:26:23 03/10/2016 19:27:24 0000 0000.0 0000.0 00
0000000 0010 0018952 0010 04
1 0 2 00512 1 0000 0015 00829.o 0 0 00 000 12 150024 0.020 BT1
1 1 2 00512 1 0000 0015 00829.o 0 0 00 000 00 150024 3.1746 BC1
1 0 2 00512 1 0000 0015 00829.o 0 0 00 000 12 150023 0.020 BT1
1 1 2 00512 1 0000 0015 00829.o 0 0 00 000 00 150023 3.1746 BC1
邪ラ。ラシゥラOォラそラa泰ラL釐!TリラヨZラョェラ㌘ラtKラTxラ%rラ晗o蹟( ラ・ラュラソCラ 碩>槞遞ラM泰%ャラキラCコラdコラ・ラマララララ=・"ョfリツリタリリVリN/リコ4リ6DリDHリVリリDリヒ_リラaリjリYnリヲyリ|リ>リヲ筋X筋ト娩壓s」リ。「リgゥリッリyッリ┝リクチリソリ捨リ橆リH籀 ゚リチ袙、毖・リハ."ルYル-ルナル ルア'ルI2ルト6ル・ル・ルカ@ル'Jル祟ルxVル輯ル(cルjdルナiルHlルjルoルョtルモgルミpルnル+uル`pル綠ル2・ツEj\MソMS・果_ッ・Xオ・T-適・A」・s=FC>輅筋フfヘナシk・u%dロ0ヨа4ヒセ・ヲ ・・・・・・・・・・・・・・・・
-----③簡単なデータ構造
固定ヘッダ行1
固定ヘッダ行2
固定ヘッダ行3
データセットヘッダ行1
データセットヘッダ行2
データセットヘッダ行3
データセットヘッダ行4
データセット1 (512x4バイト)
データセット2 (512x4バイト)
データセット3 (512x4バイト)
データセット4 (512x4バイト)
------④プログラム
DebugFiles = 'C:\Users\ken\Documents\MATLAB\161004';
%ファイル名をフルパスごと取得  「161004」というフォルダ
D = dir(DebugFiles);
%フォルダ内のファイルの名前を全取得
for k = 1:length(D)
% ファイルオープン
fid = fopen('D(k).name');
% ヘッダー読み込み
for i = 1:3
headers{i} = fgetl(fid);
end
% データセットの数を取り出し
third_header = sscanf(headers{3},'%f');
num_datasets = third_header(end); %データセット数
% データセットのヘッダーを読み込み
datasetheader = {};
for i = 1:num_datasets
datasetheader{i} = fgetl(fid);
end
%fread(fid,2,'uint8') % Read CRLF=13d 10d
% データセットのヘッダーに記載されたデータ分バイナリデータを読み込む
data = {};
for i = 1:num_datasets
dataheader_parsed = sscanf(datasetheader{i},'%d');
num_read = dataheader_parsed(4); %1つのデータセットのデータ数
[data{i},cout] = fread(fid,num_read,'long');
fread(fid,2,'uint8') % Read CRLF=13d 10d
end
% データファイルのクローズ
fclose(fid);
% 行列に整形(各データの数が同じ場合は成功)
DataMat = [data{:}];
plot(DataMat);
hold on
end
  2 Comments
Jiro Doke
Jiro Doke on 31 Jul 2017
具体的なエラー情報(エラーメッセージとどの行でエラーが起きるか、等)を追加してください。

Sign in to comment.

Accepted Answer

michio
michio on 31 Jul 2017
Edited: michio on 31 Jul 2017
「1日分」をどこまで厳密に指定されるか次第ですが・・・少なくとも計測開始日はファイル名だけで絞り込めそうです。計測終了までとなると・・ファイル中身(2行目)を見て行く必要がありますね。
03/10/2016 19:26:23 03/10/2016 19:27:24 0000 0000.0 0000.0 00
ファイル名で絞り込む場合は、いま
D = dir(DebugFiles);
と実行している所を
D = dir(DebugFiles, '*16A03*');
と変更すると、2016年10月3日に計測開始されたファイルだけが選ばれますので、その日のデータだけを読み取ることになる・・かと思いますが、いかがでしょう?
ファイルフォーマット を確認するとファイル名の命名規則が冒頭で説明されています。例えば e16A0319.272413 を例に取ると
(略) the filename, which begins with
  • a letter -> e (意味はわかりませんが・・)
  • two digits showing the years in the century -> 16 (2016年)
  • the month (hexadecimal, one digit) -> A (16進数なので10月)
  • the day (decimal, two digits) -> 03 (3日)
  • the hour (decimal, 24 hours per day, two digits) -> 19 (19時)
といった感じです。
  7 Comments
nknknknk
nknknknk on 2 Aug 2017
for k=3:length(D) → for i=3:length(D) fid=fopen(D(k).name,'r'); → fid=fopen(D(k).name); 上記変更で解決しました。
ありがとうございました。グラフについてまた質問させていただきます。 よろしくお願い致します。。

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!