CSVファイルからの​読み込んだ文字(数字​)データの数字への変​換

カンマ区切りのCSVファイル(test.csv(10x10の数字データ))から数字を読み出そうとしています。
下記のように書いたのですが、
v = str2double(dt);
でvに入る値がNaNになってしまいます。
ステップ実行でdtを見る限り正しく文字(数字)が入っているのですが、vにはNaNが入ります。
何を間違えているのでしょうか。
fid = fopen('test.csv', 'r');
databox = zeros(10);
for r = 1:10
d = fgetl(fid);
[dt, rem] = strtok(d, ',');
v = str2double(dt);
databox(r, 1) = real(v);
for c = 2:10
[dt, rem] = strtok(rem, ',');
v = str2double(dt);
databox(r, c) = real(v);
end
end
fclose(fid);

6 comentarios

Atsushi Ueno
Atsushi Ueno el 11 de Mzo. de 2024
...まさか
str2double('1+2i')
ans = NaN
澄人
澄人 el 11 de Mzo. de 2024
数字(文字)は、3や-5、3.14159など試しましたが、全部NaNでした。
Atsushi Ueno
Atsushi Ueno el 13 de Mzo. de 2024
ロケール設定を確認してみてはいかがでしょうか。
澄人
澄人 el 14 de Mzo. de 2024
改めて設定し直してみましたが、残念ながら効果はありませんでした。
普通であれば、ちゃんと読みだした数字になるということでよいでしょうか。
Atsushi Ueno
Atsushi Ueno el 14 de Mzo. de 2024
Editada: Atsushi Ueno el 14 de Mzo. de 2024
which str2double
/MATLAB/toolbox/matlab/strfun/str2double.m
上記の様なMATLABのシステムフォルダではない所が表示されたら、MATLAB組み込みの str2double 関数とは全く異なる str2double 関数が呼び出されてしまっています。
澄人
澄人 el 27 de Mzo. de 2024
Editada: 澄人 el 28 de Mzo. de 2024
遅くなってしまいましたが、確認しました。
C:\Program Files\MATLAB\R2023b\toolbox\matlab\strfunにある、str2double.mが読み出されているので、問題ありませんでした。
また問題は別にあったことが分かりました。
CSVファイルの方がBOM付きのUTF-8だったのが問題でした。
BOMを無くしたことで正常に読み込むことができました。
返答ありがとうございました。

Iniciar sesión para comentar.

 Respuesta aceptada

Atsushi Ueno
Atsushi Ueno el 27 de Mzo. de 2024
Movida: Atsushi Ueno el 28 de Mzo. de 2024

1 voto

なるほどそうでしたか。
readmatrix関数などの高水準関数を使えばこの様な問題を回避する事ができます。
readmatrix('test.csv') % UTF-8 BOM付き⇒問題ない
ans = 2x5
1 2 3 4 5 6 7 8 9 10
readmatrix('test2.csv') % UTF-8 BOM無し⇒問題ない
ans = 2x5
1 2 3 4 5 6 7 8 9 10
問題を再現させて確認しました。
fid = fopen('test.csv', 'r'); % UTF-8 BOM付き
rem = fgetl(fid) % 文字として表示しても判らないが...
rem = '1,2,3,4,5'
unicodeValues = dec2hex(double(rem)) % 最初に0xFE,0xFFが付いている!
unicodeValues = 10x4 char array
'FEFF' '0031' '002C' '0032' '002C' '0033' '002C' '0034' '002C' '0035'
v = str2double(rem) % BOMが付いているので、NaNになった
v = NaN
v = str2double(rem(2:end)) % BOMを除けば正しく読み込める(数字が連結されるのは仕様)
v = 12345
fclose(fid);
fid = fopen('test2.csv', 'r'); % UTF-8 BOM無し
rem = fgetl(fid)
rem = '1,2,3,4,5'
unicodeValues = dec2hex(double(rem)) % BOMは付いていない
unicodeValues = 9x2 char array
'31' '2C' '32' '2C' '33' '2C' '34' '2C' '35'
v = str2double(rem) % 問題ない(数字が連結されるのは仕様)
v = 12345
fclose(fid);

2 comentarios

澄人
澄人 el 28 de Mzo. de 2024
Movida: Atsushi Ueno el 28 de Mzo. de 2024
readmatrixを使えればよかったのですが、
Coderを通してC++に変換するのに際して、readmatrixが対応していなかったのでこのような手段を取りました。
[dt, rem] = strtok(d, ',');
この時点で、なまじ正常に読み取れているように見えたので気付きが遅れました。
丁寧に解説までつけていただいてありがとうございました。
評価をと思いましたが、コメント欄なのでつけられないようです。
Atsushi Ueno
Atsushi Ueno el 28 de Mzo. de 2024
原因が判らないから質問するのも困難だし、回答する側も input が不明だから何が問題か想定が困難だし、QAは本当に難しいですね。勉強になります。だから評価ください。回答に移動しましたよ。

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre データ型の変換 en Centro de ayuda y File Exchange.

Productos

Versión

R2023b

Preguntada:

el 11 de Mzo. de 2024

Editada:

el 28 de Mzo. de 2024

Community Treasure Hunt

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

Start Hunting!