質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

4回答

3683閲覧

UnityにおけるCSVファイルの書き出しについて

suguru_sato

総合スコア23

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2019/02/01 05:31

UnityでUpdate関数内で計算された値
float Time
double phi1
double phi2
double theta1
double theta2
float headangle
を引数にして、これらをCSVファイルに書き出したいです.
プログラムにエラーが出てしまったのですがよくわかりません。
logSave関数でCSV書き出しの処理をしています。
また、別の.csファイルからもlogSave関数を使いたいと思っているのでstatic public にしています。
Unityは使い始めて4か月ほどで知らないことが多いですがどうかよろしくお願いします.

イメージ説明

html

1using System.Collections; 2using System.Collections.Generic; 3using System; 4using System.IO; 5using UnityEngine; 6 7public class gaze_excel : MonoBehaviour { 8 public Vector3 vector1; 9 public Vector3 vector2; 10 double theta1, phi1, theta2, phi2; 11 public Vector2 left; 12 public Vector2 right; 13 float _timer; 14 float _deltatime; 15 float headangle=0f; 16 17 // Use this for initialization 18 void Start () { 19 20 } 21 22 // Update is called once per frame 23 void Update () { 24 _timer = Time.time; 25 _deltatime += Time.deltaTime; 26 vector1 = FoveInterface.GetLeftEyeVector_Immediate(); 27 vector2 = FoveInterface.GetRightEyeVector_Immediate(); 28 theta1 = Math.Atan((double)vector1.y / (double)vector1.z) * 180 / Math.PI; ; 29 phi1 = Math.Atan((double)vector1.x / (double)vector1.z) * 180 / Math.PI; 30 theta2 = Math.Atan((double)vector2.y / (double)vector2.z) * 180 / Math.PI; 31 phi2 = Math.Atan((double)vector2.x / (double)vector2.z) * 180 / Math.PI; 32 //left.x = 4 * (float)Math.Tan(phi1 * (Math.PI / 180)); 33 //left.y = 4 * (float)Math.Tan(theta1 * (Math.PI / 180)); 34 //right.x= 4 * (float)Math.Tan(phi2 * (Math.PI / 180)); 35 //right.y = 4 * (float)Math.Tan(theta2 * (Math.PI / 180)); 36 37 38 if (_deltatime >= 0.1){ 39 headangle += 1; 40 logSave(_timer, phi1, theta1, phi2, theta2,headangle); 41 _deltatime = 0; 42 } 43 } 44 45 46 static public void logSave(float Time, double phi1, double theta1, double phi2, double theta2, float headangle) 47 { 48 StreamWriter sw; 49 FileInfo fi; 50 fi = new FileInfo(Application.dataPath + "/sensor.csv"); 51 sw = fi.AppendText(); 52 53 if (headangle < 180f) 54 sw.WriteLine("{0},{1},{2},{3},{4},{5},{6}", Time, phi1, theta1, phi2, theta2, -headangle); 55 else 56 sw.WriteLine("{0},{1},{2},{3},{4},{5},{6}", Time, phi1, theta1, phi2, theta2, -(headangle-360f)); 57 58 sw.Flush(); 59 sw.Close(); 60 } 61 62}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

sw.WriteLine("{0},{1},{2},{3},{4},{5},{6}", Time, phi1, theta1, phi2, theta2, -headangle);

これは、
sw.WriteLine(String.Format("{0},{1},{2},{3},{4},{5},{6}", Time, phi1, theta1, phi2, theta2, -headangle));
ということでしょうが、引数の数があってません

こういう書き方もできます
sw.WriteLine($"{Time},{phi1},{theta1},{phi2},{theta2},{-headangle}");

#他のところも同様

投稿2019/02/01 05:49

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

suguru_sato

2019/02/01 06:00

ありがとうございます。フォーマットについて知識が足りていませんでした。
guest

0

ベストアンサー

こんにちは。

IOエラー以前の問題として、
CSVに書き出す際の文字列フォーマットのプレースホルダ数と変数の数が合っていないので書き込む瞬間にエラーで死んでいます。
そして、一度エラーで死ぬことで開いた書き込みストリームが閉じられなくなるので、それ以降に開こうとするときに全部IOエラーで死にます。ログの通りです。

テストしていませんが、以下のように書き換えでどうでしょう。

csharp

1 static public void logSave(float Time, double phi1, double theta1, double phi2, double theta2, float headangle) 2 { 3 var fi = new FileInfo(Application.dataPath + "/sensor.csv"); 4 using (var sw = fi.AppendText()) 5 sw.WriteLine("{0},{1},{2},{3},{4},{5}", 6 Time, phi1, theta1, phi2, theta2, 7 (headangle < 180f) ? -headangle : -(headangle-360f)); 8 }

投稿2019/02/01 05:44

tamoto

総合スコア4103

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2019/02/01 05:48

unity 2017から文字列補間が使えるので、$"{Time},"を使うことも追加でお薦めします。
suguru_sato

2019/02/01 05:57

できました。ミスの指摘してくださった上に、より簡潔なコードを提供してくださりありがとうございました。文字列補間の件、承知しました。ありがとうございました!
suguru_sato

2019/02/01 06:59

ありがとうございました、助かります。
tamoto

2019/02/01 07:05

「開いて、閉じる」という使い方をするオブジェクトなら、だいたいがusingで使えるように作られているので、何かを「使う」ときは積極的にusingを使うようにしましょう!
guest

0

エラー文にエラーを起こしている行数表示されてるよ。
320行目にエラーだって。

投稿2019/02/01 05:35

stdio

総合スコア3307

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

SharingViolationなんで、そのファイル開かれてませんか?

投稿2019/02/01 05:37

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2019/02/01 05:40

自分のプログラムが開いてるからかな。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問