CSVデータで指定し​た列数だけ行数を切り​取り、正方形のデータ​として抽出したい

51 views (last 30 days)
Inagaki takeshi
Inagaki takeshi on 12 May 2021
Commented: Inagaki takeshi on 28 May 2021
音声データ(wav)をCSVに変換、そのCSVファイルをこちらで指定した行数で列数を切り分けたデータ(いわば正方形)を量産したいと考えています。
(例:257行、5000列のcsvデータに対し、こちらで0行から100行指定。→0からの100行×100列を5000列まで、新たなcsvとして切り分け保存するループのようなもの)
音声データをcsvファイルに変換することはできたのですが、そこからの分割が手も足も出ないです。
読み込み→指定して切り分け、保存→ループ→終了の流れはなんとなく掴めてはいるのですが。。。
どのような関数を使い組み立てていけばよいのでしょうか、ご教授願いたいです。

Accepted Answer

Kojiro Saito
Kojiro Saito on 12 May 2021
reshapeを使えば簡単にできそうです。
以下のようなサンプルでどうでしょうか?
t = readmatrix('data.csv');
numLines = 1:100;
n = size(numLines,2);
rt = reshape(t(numLines,:), n, n, []);
for n=1:size(rt,3)
filename = sprintf('data%d.csv', n);
writematrix(rt(:, :, n), filename)
end
  5 Comments
Atsushi Ueno
Atsushi Ueno on 27 May 2021
ファイル名の事を考えていませんでした。filenameを変えればやりたい事は出来ます。但し重ね合わせ量の変更には対応していません。コメントにて追加された要件を統合すると、私の変更対応は場当たり的過ぎます。切り出す所から変更した方が良さそうですね。やります。
for n=1:size(rt,3) % 切り出した行列を半分ずつ重ね合わせてcsvファイルに出力する
filename = sprintf('data%d.csv', 2*n-1); % ファイル番号を2n-1にする
writematrix(rt(:, :, n), filename);
if(n < size(rt,3)) %最後の端でなかったらn枚目の後半とn+1枚目の前半を出力する
filename = sprintf('data%d.csv', 2*n); % 重なる部分はファイル番号を2nにする
writematrix([rt(:, 51:100, n) rt(:, 1:50, n+1)], filename);
end
end
Inagaki takeshi
Inagaki takeshi on 27 May 2021
Edited: Inagaki takeshi on 27 May 2021
Uenoさん対応ありがとうございます、ファイル保存の謎は解けました。
ちょうど重ね合わせの量のこともお聞きしたかったので助かります。
将来的には1-100、81-180、161-260、241-340(N量ずつ重ね合わせ、この場合は片側20の計40の重ね合わせ) のような複雑な重ね合わせ切り出しも考えているので、お力添えをしていただけると幸いです。
自分も切り出しの部分から見直しをしてみます。
よろしくお願いいたします。

Sign in to comment.

More Answers (1)

Atsushi Ueno
Atsushi Ueno on 27 May 2021
前回答のコメントで追加された要件への対応です。末端の処理は「余るデータを切り捨て」ではなく「データ数不足でも保存」に変更しました。while文ループなのでreshape関数に比べると処理が遅いです。
function k = moving_window_data2csv(n, m)
% CSVファイルの数値データをmoving windowで走査し別CSVファイルに保存する
% 引数: n:指定抽出行数(=指定抽出列数)
% 引数: m:指定移動列数
% データ先頭から指定抽出行数×指定抽出列数を抽出する
% 行方向の指定抽出行数以降のデータは抽出不要(逆に行数不足でも抽出する)
% 列方向は指定移動列数ずつずらしながら列の最後まで抽出していく
% 抽出した指定抽出行数×指定抽出列数のデータは各々異なるCSVファイルに保存する
% 指定抽出行数×指定抽出列数未満のデータ数があれば最後のCSVファイルに保存する
k = 0; % ファイル名用カウンタ
t = readmatrix('data.csv'); %csvファイルの素性が決定されていれば、最初のn行のみ読み出すべき
t = t(1:min(n,size(t,1)), :); % 速度向上の為、頭から指定抽出行数のみまとめて抽出
while ~isempty(t)
k = k + 1;
writematrix(t(:, 1:min(n,size(t,2))), ['data' num2str(k) '.csv']);
if n^2 >= numel(t), break; end % 残りデータ数が全て抽出済なら終了
t(:, 1:min(m,size(t,2))) = []; % データ先頭から指定移動列数を削除する
end
end
手持ちのmatlabが古くreadmatrix,writematrix関数を直接動確できませんでした。
作りながら、これは音声フィルタ処理の為の前処理”Moving Window”である事に気付きました。MATLABにも"moving window"を動かして何らかの演算を行う関数が多数あります(下記参照)。コメントにあった末端の処理方法(データを切り捨てるかゼロ埋めするか等)も選択肢を持っています。しかし、moving windowが捉えたデータそのものを出力する機能はいずれの関数にもありません。もしかするとMoving Window機能単体が動作するMATLAB関数が何かあるかもしれません。
  • デジタルフィルタ(filter, filter2関数)
  • 畳み込み演算(conv, conv2関数)
  • 移動平均等の演算(movsum, movprod関数など)
  3 Comments
Atsushi Ueno
Atsushi Ueno on 27 May 2021
moving window機能(slide function)単体の関数 slidefun - File Exchange - MATLAB Central (mathworks.com)
Inagaki takeshi
Inagaki takeshi on 28 May 2021
Uenoさん、ありがとうございます。
動作確認は出来ました。問題なく動きそうです。
moving window、初めて聞きました、自分も調べてみます。
色々と助かります。ありがとうございます。

Sign in to comment.

Tags

Products


Release

R2021a

Community Treasure Hunt

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

Start Hunting!