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

조회 수: 45 (최근 30일)
NK
NK 2022년 8월 3일
댓글: NK 2022년 8월 4일
添付(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のまま読み込みたいと思っています。
上記うまく読み込めない現象へのお心当たり、及び解決策をお教えいただけますと助かります。

채택된 답변

Atsushi Ueno
Atsushi Ueno 2022년 8월 3일
편집: Atsushi Ueno 2022년 8월 3일
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
NK
NK 2022년 8월 4일
複数の対策と詳細な説明をいただきありがとうございました。
確認したところ、確かに先頭の空白文字が無くなっており、更に有効桁数も減っていました。おっしゃる通り、Excelcsvファイルを開いて別名を保存しておりました。元ファイルのフォーマットが変わると知らず、こちらの確認不足で申し訳ありませんでした。また、仕様と状況をご指摘いただきありがとうございました。
空白文字が原因だったとのこと、こちらでも確認し納得いたしました。今回ご相談させていただいていた件と同じような現象で正常に読み込めなかったcsvファイルに関しても、「問題解消その4」で全て不具合が解消されましたため、こちらの回答を採用させていただきます。
お忙しい中にも関わらずご協力いただきまして大変ありがとうございました。

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Hernia Baby
Hernia Baby 2022년 8월 3일
スプレッド形式として読み込めてないのかもしれません。
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
Hernia Baby
Hernia Baby 2022년 8월 3일
편집: Hernia Baby 2022년 8월 3일
■'ZR1a.csv'でうまくいくか検証
format shortE
T1 = readmatrix('ZR1.csv')
T1 = 25×4
NaN NaN -2.9885e-03 NaN NaN NaN NaN 1.7668e-04 NaN NaN NaN 3.7049e-03 NaN NaN -1.5812e-02 NaN NaN NaN -2.1197e-03 NaN NaN NaN NaN 2.8029e-03 NaN NaN -8.2668e-04 NaN NaN NaN NaN 6.0574e-04 NaN NaN -6.9758e-05 NaN NaN NaN -4.0905e-05 NaN
T2 = readmatrix('ZR1a.csv')
T2 = 25×4
NaN NaN -2.9885e-03 NaN NaN NaN NaN 1.7668e-04 NaN NaN NaN 3.7049e-03 NaN NaN -1.5812e-02 NaN NaN NaN -2.1197e-03 NaN NaN NaN NaN 2.8029e-03 NaN NaN -8.2668e-04 NaN NaN NaN NaN 6.0574e-04 NaN NaN -6.9758e-05 NaN NaN NaN -4.0905e-05 NaN
上記でもわかる通り、差異は見られませんでした。
■メモ帳で中身がどうなっているのか確認
@Atsushi Uenoさんが述べている通り、
おそらく前の空白2文字が悪さをしているのだと思います。
そして空白2文字とハイフンを文字として認識しているの可能性もあります。
■ZR1b(見栄えをそろえるため正数に1つスペースを置いたもの)を読み込み
T3 = readmatrix('ZR1b.csv')
T3 = 36×2
NaN 1.0484e-01 -1.7600e-01 NaN NaN 1.9665e-01 -5.3533e-02 NaN NaN 5.6684e-03 NaN 1.1201e-02 NaN 1.6328e-01 -1.0124e-01 NaN NaN 4.4704e-03 NaN 2.0604e-02
やはり空白が悪さしていますね。
■ZR1c(前のスペースを消したもの)を読み込み(確認用)
T4 = readmatrix('ZR1c.csv')
T4 = 36×1
1.0484e-01 -1.7600e-01 1.9665e-01 -5.3533e-02 5.6684e-03 1.1201e-02 1.6328e-01 -1.0124e-01 4.4704e-03 2.0604e-02
以上で前の空白が影響を与えていることがわかりました。
■すべて正数の場合(ハイフンなし)
T5 = readmatrix('ZR1d.csv')
T5 = 36×4
NaN NaN NaN 1.0484e-01 NaN NaN NaN 1.7600e-01 NaN NaN NaN 1.9665e-01 NaN NaN NaN 5.3533e-02 NaN NaN NaN 5.6684e-03 NaN NaN NaN 1.1201e-02 NaN NaN NaN 1.6328e-01 NaN NaN NaN 1.0124e-01 NaN NaN NaN 4.4704e-03 NaN NaN NaN 2.0604e-02
■対策
空白の対処 or FileType関連と考えました。
エクセルで見てみると1列だったため、スプレッド形式なら読めると判断したからです。
T6 = readmatrix('ZR1.csv',FileType='text')
T6 = 25×4
NaN NaN -2.9885e-03 NaN NaN NaN NaN 1.7668e-04 NaN NaN NaN 3.7049e-03 NaN NaN -1.5812e-02 NaN NaN NaN -2.1197e-03 NaN NaN NaN NaN 2.8029e-03 NaN NaN -8.2668e-04 NaN NaN NaN NaN 6.0574e-04 NaN NaN -6.9758e-05 NaN NaN NaN -4.0905e-05 NaN
■'NumHeaderLines'で解消する理由の考察
インポートツールのロジックを動かしている可能性があり、そのため解消したのかもしれません。
uiopenで見てみると確かに前方の空白が消えています(後ろに空白ができているが…)。
NK
NK 2022년 8월 4일
解消法のご提示、及び幾度に渡る検証をしていただきありがとうございました。
出力結果や説明文スクリーンショットを付けてくださっていたため、状況をよく理解することができました。
お忙しい中にも関わらずご協力いただきまして大変ありがとうございました。

댓글을 달려면 로그인하십시오.

태그

제품


릴리스

R2022a

Community Treasure Hunt

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

Start Hunting!