Borrar filtros
Borrar filtros

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

7 visualizaciones (últimos 30 días)
澄人
澄人 el 11 de Mzo. de 2024
Editada: 澄人 el 28 de Mzo. de 2024
カンマ区切りの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 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
なるほどそうでしたか。
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 Data Import from MATLAB en Help Center y File Exchange.

Productos


Versión

R2023b

Community Treasure Hunt

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

Start Hunting!