2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【MATLAB】空白セル有りCSVファイルを処理する

Last updated at Posted at 2021-01-24

はじめに

前回CSVファイルに計算セルを追加してexcelファイルとして保存するやつを実装した.

前回使ったCSVファイルは1行目にデータのラベルがあって各列に同じタイプのデータが並ぶという非常にきれいな作りになっているが,業務で実際取り扱うファイルはもっとぐちゃぐちゃになっている.
ざっくり説明すると以下のような感じ.

1

同じデータが横方向に並んでいるし,excelで開いた時の'''映え'''を重視して5行目に空行とかG列に空列が入ってたりする.

データが横に並んでいる点についてはmatlabで処理する上では特に問題はなかったが,空白セルが入ってるとそのままでは出力出来なかったので,回避方法を簡単にまとめる.
今回はエラーになってキレそう2になっているところから順に書いていくため,結論だけ見たい場合はスキップしてください.

空白セルをそのまま出力してみる

% ファイルを読み取ってcellに格納
path = 'C:\Users\dejiko';
file = '身長体重_空白セルあり.csv';
filepath = fullfile(path, file);
T = readcell(filepath,'DatetimeType','text');

% データ内容は変更せずにとりあえずそのまま出力する
Tout = T;

% ファイルに書き込む
[path, file] = fileparts(filepath);
newFile = sprintf('%s_matlab.xlsx', file);
outputFilePath = fullfile(path, newFile);
writecell(Tout, outputFilePath);

結果

実行してみると,以下のようなエラーが出て終了してしまった.
missing.png

エラー: writecell (line 119)
'missing' 型の cell 要素はサポートされていません.書き込む前に,要素を数値,logical,string,datetime,duration または categorical
に変換してください.

とのこと3

missingの罠

変数Tの中身をmatlabで表示してみると,以下のようになった.空白セルはmissingという型で格納されるらしく,出力する際にこれを何かに変換する必要があるっぽい.
missingT.png

missingを処理

missing部分を空charに置き換える処理を追加する.

実装

% missingを判定
missingCell = cellfun(@ismissing, T, 'UniformOutput',false);
% maskをcell2matしてlogical配列にしたいが,
% char配列のセルについては{1×N(文字数) logical}になっていて,そのままではcell2matできない
% {1×N logical}となっている部分を抽出して{1×1 logical}に置き換える
len = cellfun(@length, missingCell, 'UniformOutput',false);
len = cell2mat(len);
lenMask = len ~= 1;
missingCell(lenMask) = {false};
% 全セルが{1×1 logical}になったのでcell2mat出来る
mask = cell2mat(missingCell);

Tout = T;
% missing部分を空文字に置き換える
Tout(mask) = {''};

解説

まずismissingで各セルがmissingかどうかを判定する.

missingCell = cellfun(@ismissing, T, 'UniformOutput',false);

以下にismissingした結果を示す.
文字列の部分が{1×N logical}となっており,このままではcell2matが出来ない.


次に`{1×N logical}`となる部分を抽出するために,`length`を適用する.
len = cellfun(@length, missingCell, 'UniformOutput',false);
len = cell2mat(len);
lenMask = len ~= 1;

次に`{1×N logical}`の部分を`{false}`に置き換える.
missingCell(lenMask) = {false};

これで全部{1×1 logical}になったので,cell2matしてマスクを作って元のセルにマスクを適用すれば終わりである.

まとめ

空白セルを考慮したexcelファイルの入出力をmatlabで実装した.
引き続きexcelとの和解を果たしていく.

  1. https://ja.wikipedia.org/wiki/%E3%81%8A%E3%81%A1%E3%81%93%E3%81%BC%E3%82%8C%E3%83%95%E3%83%AB%E3%83%BC%E3%83%84%E3%82%BF%E3%83%AB%E3%83%88

  2. https://www.nicovideo.jp/watch/sm37510647

  3. https://www.google.com/search?q=%E3%81%AF%E3%81%84%E3%81%AF%E3%81%84%E5%87%9B%E4%B8%96%E3%81%8C%E6%82%AA%E3%81%86%E3%81%94%E3%81%96%E3%81%84%E3%81%BE%E3%81%97%E3%81%9F

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?