- ベストアンサー
MATLABのCSV形式での書き込みについて
MATLABにて計算させた結果をCSV形式で出力したいのですが, もともとCSVファイルに書き込んであるデータを消さずに, 追加書き込みとして,行と列を指定して書き込み出来るのでしょうか? もしできるのであれば, どのようなプログラムを組めばよいのでしょうか? どなたかご教授お願いします.
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
speedとpowerはdouble型の行列ですよね? fwrite関数はバイナリ保存関数ですので、CSV形式(=テキスト形式)での保存はできません。 dlmwrite関数では小数点以下12桁までを指定して保存していますので、fprintf関数を使用すれば良いのではないかと思います。 なお、fprintf関数を使用する場合は、区切文字(,)や改行は自動で追加されませんので、以下のように記述する必要があります。 fprintf(fid, '%.12f,', speed); fprintf(fid, '\n'); fprintf(fid, '%.12f,', power); fprintf(fid, '\n'); ただ、この方法では各行の末尾にもカンマが出力されますので、それを抑止したい場合は、speedとpowerの各要素をループの中で保存してください。 ■ fprintf関数 http://infoshako.sk.tsukuba.ac.jp/InfoRes/jdoc/MATLAB5/jhelp/techdoc/ref/fprintf.html また、プログラムではfor文の中でfopenとfcloseを繰り返していますが、余り良いことではありません。見たところファイル名は一定のようですので、fopenとfcloseはfor文の外でするべきだと思います。そうすれば処理速度も向上しますし、別に追記でfopenする必要もありません。 fid = fopen('file1.csv', 'w'); for fprintf(fid, ....); end fclose(fid); 最後に、この場合はファイルの出力方法を変更する以外に、speedとpowerをループ回数分保存するように変更する方法もあるのではないかと思います。
その他の回答 (1)
- sgwjn
- ベストアンサー率70% (47/67)
fopen関数のpermissionの指定を「a」か「a+」にすれば追記が可能です。 ■ fopen関数 http://infoshako.sk.tsukuba.ac.jp/InfoRes/jdoc/MATLAB5/jhelp/techdoc/ref/fopen.html
お礼
sgwjnさん,迅速に回答していただきましてありがとうございます! 教えて頂いた通りやってみました! ************************************************************ for... 途中省略 fid = fopen('file1.csv','a+' ) fwrite(fid,speed,'double') fwrite(fid,power,'double') fclose(fid) next ************************************************************ と,プログラムしたのですが,エクセルで開くと変な文字になってしまいました. ちなみにspeedとpowerは計算させた1×101の行列です. 以前は以下のように書き込みをしていたのですが・・・ ************************************************************ dlmwrite(file1.csv',[speed;power]', 'precision', '%.12f',... 'delimiter',',','roffset',0,'coffset',0) ************************************************************ これだと,ちゃんとエクセルで開けて問題なかったのですが, 今回はforループで繰り返し計算させながら 書き込みさせなくてはいけないので,これをループの中に入れたら 最後のループしか書き込みされませんでした.
お礼
なるほど!そうすればよかったんですね★ お陰ででうまくエクセルで読むことができました! 本当にありがとうございました!