csvファイルを正確に読み込めない
30 次查看(过去 30 天)
显示 更早的评论
添付(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のまま読み込みたいと思っています。
上記うまく読み込めない現象へのお心当たり、及び解決策をお教えいただけますと助かります。
0 个评论
采纳的回答
Atsushi Ueno
2022-8-3
编辑:Atsushi Ueno
2022-8-3
format longE
readmatrix('ZR1.csv') % 問題の再現('ZR1.csv'と同じ指数形式で表示)
readmatrix('ZR1.csv','Delimiter',',') % 問題の解消その1 (デリミタ文字の指定)⇒解消した
% 問題の解消その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 个)
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
2022-8-3
编辑:Hernia Baby
2022-8-3
■'ZR1a.csv'でうまくいくか検証
format shortE
T1 = readmatrix('ZR1.csv')
T2 = readmatrix('ZR1a.csv')
上記でもわかる通り、差異は見られませんでした。
■メモ帳で中身がどうなっているのか確認
@Atsushi Uenoさんが述べている通り、
おそらく前の空白2文字が悪さをしているのだと思います。
そして空白2文字とハイフンを文字として認識しているの可能性もあります。
■ZR1b(見栄えをそろえるため正数に1つスペースを置いたもの)を読み込み
T3 = readmatrix('ZR1b.csv')
やはり空白が悪さしていますね。
■ZR1c(前のスペースを消したもの)を読み込み(確認用)
T4 = readmatrix('ZR1c.csv')
以上で前の空白が影響を与えていることがわかりました。
■すべて正数の場合(ハイフンなし)
T5 = readmatrix('ZR1d.csv')
■対策
空白の対処 or FileType関連と考えました。
エクセルで見てみると1列だったため、スプレッド形式なら読めると判断したからです。
T6 = readmatrix('ZR1.csv',FileType='text')
■'NumHeaderLines'で解消する理由の考察
インポートツールのロジックを動かしている可能性があり、そのため解消したのかもしれません。
uiopenで見てみると確かに前方の空白が消えています(後ろに空白ができているが…)。
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 スプレッドシート 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!