複数データのインポートと統合

ある観測データがあり、1時間ごとにファイルが分かれており、ファイル名はそれぞれ異なっています。(ファイル名は連番ではないものもあります)
これらのファイルデータを全てインポートして、全データを統合して分析やplotを作成したいと思っていますが、どんなふうにしたら簡単にまとめられるか思いつきません…。
よい方法をご存知の方がいらっしゃいましたらご教示ください。
完成イメージはこんな形です。

 Accepted Answer

Toru Ikegami
Toru Ikegami on 27 Aug 2021
Edited: Toru Ikegami on 27 Aug 2021

1 vote

こんにちは,
同じ形式のファイルをある程度の数処理するのでしたら,データストアを利用してみるのはいかがでしょう.データストアの概要はドキュメントの 「データストア入門」を参照してください.
読み込みたいファイルが全て 'dataFolder' という名前のフォルダに格納されているとすると,次の2行で,フォルダにある全てのファイルを読み込み,データを結合したテーブル変数 dataTbl を生成することができます.
ds = tabularTextDatastore('dataFolder');
dataTbl = readall(ds);
上の2行が基本になるのですが,フォルダの中の特定の拡張子を持つファイルのみを処理するとか,読み込む際のデータの型を指定するなど,様々なオプションを利用することが出来ます.「データストア入門」と,tabularTextDatastore のドキュメントを参考にされると良いと思います.
添付されていたファイルに対して有用かと思われるオプションをつけると次のようになるでしょうか.
ds = tabularTextDatastore('dataFolder','TextType','string','DatetimeLocale','ja_JP');

5 Comments

Yu
Yu on 29 Aug 2021
早速ご回答くださりありがとうございます。
実はヘッダーと変数の列数が一致しておらず、以下写真のように、インポート範囲を指定したいと思っております。(黄色:ヘッダー、緑:変数)
ドキュメントを読んだのですが、どのように指定すればよいか分からなかったため、ご存知でしたらご教示頂けますと幸いです。
Toru Ikegami
Toru Ikegami on 30 Aug 2021
こんにちは,
インポート範囲を指定する必要がある場合には,読み込み関数を自作できるデータストア fileDatastore を使うことになると思います.この場合,作業は2段階で,まず単一ファイルを読み込むための読み込み関数の設定を行い,次にその関数を fileDatastore の読み込み関数として登録します.
最初に,単一ファイルを読み込むための関数の設定を行います.この部分で何回か試行錯誤が必要かもしれません.
関数 detectImportOptions を使って,ファイルの内容から読み込み設定をある程度自動で取得した後で,微調整をします.設定できたら,いくつかのファイルで正しく読めるかどうか確認します.
varNamesLine = 8; % 変数名が記述されている行
dataLine = 11; % データ読み込み開始行(スカラーで指定された場合には,その行以降全ての行)
% 読み取りオプションの自動取得と微調整
opt = detectImportOptions("dataFolder/sample1.csv","DateLocale","ja_JP","TextType","string");
opt.VariableNamesLine = varNamesLine;
opt.DataLines = dataLine;
% ちゃんと読めているかどうか確認
tmp = readtable("dataFolder/sample1.csv",opt);
次にファイルデータストアを構成します.読み取り関数としては上で使った readtable を読み込みオプション付きで使用しますが,そのまま書かずに無名関数を使って記述します.また,全てのデータを一つのテーブルにまとめるために,UniformRead オプションを true に設定します.
% ファイルデータストアの構成
ds = fileDatastore("dataFolder","ReadFcn",@(x) readtable(x,opt),"UniformRead",true);
データを一括で読み込みます.
% データの一括読み込み
data = readall(ds);
Yu
Yu on 30 Aug 2021
おはようございます。早速ご回答くださりありがとうございます。
関数ハンドルなど、とても勉強になります。
試しに添付の2つのtxtファイルを読み込んでみたところ、初めの1回は問題なくできたのですが、
dataFolderにファイルを追加し、再度実行すると以下のエラーが出てしまいます。
もとの2ファイルに戻しても同じエラーが出てしまうのですが、どうすればよいでしょうか?
varNamesLine = 8; % 変数名が記述されている行
dataLine = 11; % データ読み込み開始行(スカラーで指定された場合には,その行以降全ての行)
% 読み取りオプションの自動取得と微調整
opt = detectImportOptions("dataFolder/sample1.txt","DateLocale","ja_JP","TextType","string");
opt.VariableNamesLine = varNamesLine;
opt.DataLines = dataLine;
% ちゃんと読めているかどうか確認
tmp = readtable("dataFolder/sample1.txt",opt);
% ファイルデータストアの構成
ds = fileDatastore("dataFolder","ReadFcn",@(x) readtable(x,opt),"UniformRead",true);
% データの一括読み込み
data = readall(ds);
Toru Ikegami
Toru Ikegami on 30 Aug 2021
すみません.お伝えした例だと fileDataStore を構成する際に,ファイルの拡張子を指定していませんでした.以下試してみていただけますか?
ds = fileDataStore("dataFolder","ReadFcn",@(x) readtable(x,opt),...
"UniformRead",true,"FileExtensions","txt");
拡張子無指定ですと,フォルダ内にある全てのファイルを読み込むので,MATLABが生成する.DS_Store というファイルをも読み込んで,他のファイルから読み込んだデータと結合しようとします.この過程でエラーが発生すると考えられます.
Yu
Yu on 30 Aug 2021
".txt"
で無事読み込めました。
何度も丁寧にご対応くださりありがとうございました!

Sign in to comment.

More Answers (0)

Categories

Find more on MATLAB 入門 in Help Center and File Exchange

Asked:

Yu
on 27 Aug 2021

Commented:

Yu
on 30 Aug 2021

Community Treasure Hunt

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

Start Hunting!