文字列の数値化について
62 ビュー (過去 30 日間)
古いコメントを表示
以下のcellデータがあります。
A =
'73647360' [1121]
'1212' [1232]
'Phoenix' [5654563]
文字と数字があり、数字は数値と文字列に分かれています。
ここで数字は全て数値にしたいと考えています。
単純にstr2num(A)をすると、
文字列または文字配列の入力が必要です。 とエラーになります。
文字列、数値の混合する中で数字だけを数値にする方法はありますか?
宜しくお願いします。
0 件のコメント
採用された回答
Satoshi Kobayashi
2019 年 2 月 1 日
str2numでは文字を空行列に変換します。
forを使わない方法を提示します。
A = {'73647360',[1121];...
'1212',[1232];...
'Phoenix',[5654563]};
B = cellfun(@str2num,A,'UniformOutput' ,false,'ErrorHandler',@(~,t)t);
C = cellfun(@isempty,B);
B(C) = A(C);
5 件のコメント
Kenta
2019 年 2 月 2 日
Satoshi Kobayashi 様
コメントの返信ありがとうございます。
解説していただき、ようやく理解することができました。ありがとうございます。
教えていただいたドキュメントも見ました。非常に勉強になります。このように書けると非常に便利ですね。
ご回答ありがとうございました。
その他の回答 (1 件)
Kenta
2019 年 2 月 1 日
clear;clc
A=cell(3,2);
A{1,1}='73647360';
A{2,1}='1212';
A{3,1}='Phoenix';
A{1,2}=1121;
A{2,2}=1232;
A{3,2}=5654563;
%1)ischarでAのi行目、j列が文字配列か確認(文字ならtrue)
%2)isnanでAのi行目、j列を数字に直した時、nanにならないか(=文字として入っているA{i,j}が数字か)
%上の1および2を満たせば、A{i,j}は文字として入っている数字である=>str2doubleで数字に直せばよい
for i=1:size(A,1)
for j=1:size(A,2)
if (ischar(A{i,j})==true)&&(isnan(str2double(A{i,j}))==false)
A{i,j}=str2double(A{i,j});
end
end
end
人の手で確認する場合と同じように、for文を2回用いて訂正するのが直感的にわかりやすい気がします。
for Aを上からしたに
for Aを左から右に
として、A{i,j}が文字配列か=>(もし文字配列なら)=>A{i,j}は文字なのか、それとも文字配列として入っている数字なのか
=>(もし、文字配列として入っている数字なら)=>A{i,j}を数字に直す
もちろん、forやifを並べると実行が遅くなりますが、おそらく、大規模なデータではないと思うのでこれでよいと思いました。添付写真のような結果が返されるのでうまく走ると思います。
3 件のコメント
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!