csvファイルを正確に読み込めない

14 views (last 30 days)
NK
NK on 3 Aug 2022
Commented: NK on 4 Aug 2022
添付(ZR1.csv)のようなZR1.csvからZR10.csvまで通し番号が振られたcsvファイルを読み込みたいと考えています。
下記のコードで実行すると、添付(キャプチャ.JPG)のように正確に読み込まれません。
numfiles=10;
for k=1:numfiles
filename{k}=sprintf('ZR%d.csv',k);
File=filename{k};
zmat{k}=readmatrix(File);
end
しかし、例えばZR1a.csvのように通し番号の後に任意のアルファベットを入れてcsvファイルを保存し、下記コードでそれを読み込もうとすると上手く読み込むことができます。
numfiles=10;
for k=1:numfiles
filename{k}=sprintf('ZR%da.csv',k); ←変更
File=filename{k};
zmat{k}=readmatrix(File);
end
ZR1a.csvのようにその都度csvファイルを別名保存してから実行するのは手間がかかるので、可能であればZR1.csvのまま読み込みたいと思っています。
上記うまく読み込めない現象へのお心当たり、及び解決策をお教えいただけますと助かります。

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 3 Aug 2022
Edited: Atsushi Ueno on 3 Aug 2022
format longE
readmatrix('ZR1.csv') % 問題の再現('ZR1.csv'と同じ指数形式で表示)
ans = 25×4
NaN NaN -2.988480000000000e-03 NaN NaN NaN NaN 1.766800900000000e-04 NaN NaN NaN 3.704875000000000e-03 NaN NaN -1.581235800000000e-02 NaN NaN NaN -2.119745300000000e-03 NaN NaN NaN NaN 2.802939400000000e-03 NaN NaN -8.266818100000000e-04 NaN NaN NaN NaN 6.057403000000000e-04 NaN NaN -6.975753100000000e-05 NaN NaN NaN -4.090545400000000e-05 NaN
readmatrix('ZR1.csv','Delimiter',',') % 問題の解消その1 (デリミタ文字の指定)⇒解消した
ans = 36×1
1.048434100000000e-01 -1.760032500000000e-01 1.966533100000000e-01 -5.353340200000000e-02 5.668442500000000e-03 1.120065700000000e-02 1.632844200000000e-01 -1.012414600000000e-01 4.470368500000000e-03 2.060449000000000e-02
% 問題の解消その2 (空白として扱う文字に空白文字を指定)⇒解消しなかった
% readmatrix('ZR1.csv','Whitespace',' ')
% 問題の解消その3 (先頭のデリミタ文字を無視)⇒解消した
% readmatrix('ZR1.csv','LeadingDelimitersRule','ignore')
% 問題の解消その4 (ファイルのヘッダ行数を0行に設定)⇒解消した
% readmatrix('ZR1.csv','NumHeaderLines',0)
【現象】読込んだ行列の左端にNaNの列が2または3列ずつあり、また4列目をNaNで埋め合わせている
【現象】先頭から11行を読み飛ばし、残り25行しか読み込んでいない
【原因】'ZR1.csv'の各行先頭に2~3文字ある空白文字の対処方法を指定していない為 (結論も参照)
【確認して頂きたい事】’ZR1a.csv’をテキストエディタで開くと、'ZR1.csv'にあった先頭の空白文字が無くなっていませんか?また、元ファイルに書かれた数値の精度(有効桁数8桁)も悪くなって(有効桁数が3桁に減って)しまったのではないかと思います。もしそうであればファイル名変更方法は「Excelでcsvファイルを開き別名で保存する」だと思います。その際に元ファイルのフォーマットが変わってしまうのはExcelの仕様です。
【結論】上記原因だけでは上手く説明出来ない箇所も有ります。
readmatrix関数のドキュメントに明示されていませんが、デフォルトのデリミタ文字に空白文字を含んでいます(動作確認しました)。しかしながら、ファイルのヘッダ行数を0行に指定すると先頭に空白を含むファイルでも正常に読み込むので、同関数の仕様が明確にならないと正確な原因と何故問題が解消するのか上手く説明がつきません。
  1 Comment
NK
NK on 4 Aug 2022
複数の対策と詳細な説明をいただきありがとうございました。
確認したところ、確かに先頭の空白文字が無くなっており、更に有効桁数も減っていました。おっしゃる通り、Excelcsvファイルを開いて別名を保存しておりました。元ファイルのフォーマットが変わると知らず、こちらの確認不足で申し訳ありませんでした。また、仕様と状況をご指摘いただきありがとうございました。
空白文字が原因だったとのこと、こちらでも確認し納得いたしました。今回ご相談させていただいていた件と同じような現象で正常に読み込めなかったcsvファイルに関しても、「問題解消その4」で全て不具合が解消されましたため、こちらの回答を採用させていただきます。
お忙しい中にも関わらずご協力いただきまして大変ありがとうございました。

Sign in to comment.

More Answers (1)

Hernia Baby
Hernia Baby on 3 Aug 2022
スプレッド形式として読み込めてないのかもしれません。
readmatrixのFiletypesオプションを指定するとうまくいきました。
以下のコードでご確認ください。
Files = dir("ZR*.csv");
numfiles = length(Files);
for k=1:numfiles
filename{k} = sprintf('ZR%i.csv',k);
File = filename{k};
zmat{k} = readmatrix(File,FileType="spreadsheet"); %<-変えた場所
end
  2 Comments
NK
NK on 4 Aug 2022
解消法のご提示、及び幾度に渡る検証をしていただきありがとうございました。
出力結果や説明文スクリーンショットを付けてくださっていたため、状況をよく理解することができました。
お忙しい中にも関わらずご協力いただきまして大変ありがとうございました。

Sign in to comment.

Tags

Products


Release

R2022a

Community Treasure Hunt

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

Start Hunting!