csvファイルの一括インポートおよび一括処理

2点ほどお伺いしたいです.
➀PC内にある対象者1人分の10試技のデータを一括でインポートする方法はありますか?現在,一つのデータずつインポートしているのでかなり時間がかかっています.for文かなにか使えばよいんでしょうか...
②取り込んだ10試技のデータを一つのコードで一気に処理したいです.for文を試したのですがよくわかったため,毎回の処理で名前を変えています.具体的なコードも教えていただけますと助かります.
初歩的な質問で申し訳ありません.どなたかよろしくお願い致します.

4 Comments

Takumi
Takumi on 4 Jun 2020
何かサンプルデータを提供して頂けますか?そうすると回答がつきやすいと思います。
R
R on 5 Jun 2020
ありがとうございます.
A2,A5,A6,B3,B4,B2..のようなバラバラなファイル名を持つデータを一括で処理したいと考えています.
処理の内容は主にforceのピーク値の前後一定範囲の平均を出すというものです.よろしくお願いします.
%欠損データを埋める
fillTime = fillmissing(Time,'linear');
fillforce = fillmissing(force,'linear');
%絶対値化
absforce=abs(fillforce)
%ベースライン化
base=Data{10,2}
baseforce=fillforce-base
%平滑化
smoothforce=smoothdata(baseforce,"movmean",100)
%最大値の算出 %前後0.25sで平均
[maxvalue,index]=max(smoothforce);
maxforce=smoothforce(index-25:index+25);
ans=mean(maxforce)
Takumi
Takumi on 5 Jun 2020
一般に、連番で保存されたファイルや同じ拡張子を持つファイルを処理するときは連続するファイルのインポートまたはエクスポートを参考にされると良いかと思います。
いま処理したいcsvファイルのフォーマットや、現在どのようにファイルをインポートしているか示していただけますともう少し詳細な回答ができます。
R
R on 5 Jun 2020
インポートの方法についてありがとうございます.
現在処理したいcsv (.csv) ファイルのフォーマットは、
各列、時間 force ポジション 角度 角速度という並びになっています.
このうちforceのピーク前後の平均値を繰り返し算出したいです.
また,インポートはmatlabの”インポート”のボタンを押して一つ一つ取り込んでいます.
回答になっていますでしょうか...?

Sign in to comment.

Answers (1)

Takumi
Takumi on 5 Jun 2020
Edited: Takumi on 5 Jun 2020

2 votes

例えば、1列目に要素番号、2列目にランダムな数が5つ並んだcsvファイルが3つあり、それぞれファイル名がfile1.csv、 file2.csv、 file3.csvとなっているとします。以下のコードでサンプルファイルを生成できます。
% サンプルデータ
numfiles = 3;
x = (1:5)';
for k = 1:numfiles
y = rand(size(x)); % 乱数
mydata = table(x,y);
myfilename = sprintf('file%d.csv', k);
writetable(mydata,myfilename);
end
そして、そのファイルを連続で読み込み、ここでは簡単に、二列目の平均を算出したいとします。Rさんのcsvファイルのヘッダーがどうなっているかわかりませんが、例えば上で生成したcsvファイルはreadtable関数でテキスト ファイルから table に読み取ることができ、二列目のデータ(ここでは変数y)に対して平均化処理を適用することができます。
% ファイルのインポート,平均処理
clear
numfiles = 3;
mydata = cell(1, numfiles);
ave = zeros(1,numfiles);
for k = 1:numfiles
myfilename = sprintf('file%d.csv', k);
mydata{k} = readtable(myfilename);
ave(k) = mean(mydata{k}.y);
end

13 Comments

R
R on 6 Jun 2020
コードをありがとうございます.
私の場合,一つのフォルダ内のファイルが22個なので以下のコードを作成してみました。
実行してみたのですが、特にエラーや表記何も出ないままでした(計算しているのでしょうか...)。
ファイル名がfile1.csv、 file2.csv、 file3.csvと規則正しいものではなく、A60, D40, F10, B20のように不規則なのですがそれも関連していますか?何度も申し訳ありませんが、よろしくお願いします。
numfiles = 22;
mydata = cell(1, numfiles);
ave = zeros(1,numfiles);
for k = 1:numfiles
myfilename = sprintf('ファイル名', k);
mydata{k} = readtable(myfilename);
ave(k) = mean(mydata{k}.VarName2)
Takumi
Takumi on 7 Jun 2020
そのフォルダ内には処理したいデータ22個以外に他のファイルが入っていますか? また処理したいファイル名はA60、D40といったように拡張子を持たないファイル名ですか?
R
R on 7 Jun 2020
フォルダ内のファイルは全てで22個でした。また、それぞれのファイルは拡張子を持っていません(.csvのような形ではありません)。
Takumi
Takumi on 7 Jun 2020
Edited: Takumi on 7 Jun 2020
これでいかがでしょう?
% サンプルデータ
numfiles = 3;
x = (1:5)';
for k = 1:numfiles
y = rand(size(x)); % 乱数
mydata = table(x,y);
myfilename = sprintf('file%d', k);
writetable(mydata,myfilename);
end
フォルダ内のファイルはdir関数で参照できますので、それを利用します。
Files = dir;
Files = Files(~ismember({Files.name}, {'.', '..'})); % カレントディレクトリと親ディレクトリを除く
numfiles = length(Files);
mydata = cell(1, numfiles);
ave = zeros(1,numfiles);
for k = 1:numfiles
myfilename = Files(k).name;
mydata{k} = readtable(myfilename);
ave(k) = mean(mydata{k}.y);
end
Takumi
Takumi on 7 Jun 2020
回答の仕方が間接的で良くないような気がしてきました。
具体的に処理したいファイル(例えばA60とD40)を添付していただくことはできますか?
R
R on 7 Jun 2020
本当にご丁寧にありがとうございます.
本データに類似したサンプルファイルを添付しております.すみません,最後に拡張子がついておりました.
よろしくお願い致します.
Takumi
Takumi on 7 Jun 2020
データを拝見しましたところ、実際の数値データは6行目から始まるようですが、いつもどのようにインポートされてますか?またどのようにインポートしたいですか?
R
R on 7 Jun 2020
いつもは行を指定せずにインポートしていました。列名などを含まずに数値データのみをインポートした方が分析しやすいですか?もしそうでしたら、数値データのみを希望です。
Takumi
Takumi on 7 Jun 2020
csvファイルの最初の5行は読み飛ばすことにする場合、次のようにすると良いと思います。
ここではデータの一列目がTime、二列目がforceだと想定しています。
Files = dir('*.csv');
numfiles = length(Files);
mydata = cell(1, numfiles);
for k = 1:numfiles
myfilename = Files(k).name;
mydata{k} = readtable(myfilename,'HeaderLines',5);
Time = mydata{k}.Var1;
force = mydata{k}.Var2;
%%% ここに望む処理を追加 %%%
end
R
R on 8 Jun 2020
ありがとうございます.試してみたのですが,以下のようなエラーが出ました.
警告: ファイルからの列ヘッダーは、table の変数名の作成前に、有効な MATLAB 識別子になるように変更されました。元の列ヘッダーは、VariableDescriptions プロパティに保存されています。
元の列ヘッダーを table 変数名として使用するには、'PreserveVariableNames' を true に設定します。
table 変数名 'VarName1' が認識されません。
変数名は正しいと思います。難しいですね。。
Takumi
Takumi on 8 Jun 2020
最初に示しておけばよかったのですが、、、以下のリンクを参考にもう少し具体的に、何をどのように(どんなファイルを、どんなコードで)したら、そのようなエラーが出るのか教えていただけますか?
特にこちらでも同じ状況を完全に再現できると非常に回答しやすいです。
またエラーが出る行にブレークポイントを設定して、table変数名を確認して見るのはいかがでしょうか?
R
R on 8 Jun 2020
説明不足で申し訳ありません。ブレークポイント試してみます。
ちなみに以下のコードで処理を実行しました(ひとまずファイルの読み取りまで)。
cd csvが格納されているフォルダ名
Files = dir('*.csv');
numfiles = length(Files);
mydata = cell(1, numfiles);
for k = 1:numfiles
myfilename = Files(k).name;
mydata{k} = readtable(myfilename,'HeaderLines',5);
Time = mydata{k}.VarName1;
force = mydata{k}.VarName2;
% 処理 %
end
Takumi
Takumi on 8 Jun 2020
Time = mydata{k}.VarName1;
ではなくて
Time = mydata{k}.Var1;
ではないでしょうか。

Sign in to comment.

Products

Asked:

R
R
on 4 Jun 2020

Commented:

on 8 Jun 2020

Community Treasure Hunt

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

Start Hunting!