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

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

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

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

Q&A

解決済

1回答

10358閲覧

CSVファイルを書き込みたい。

fukkun0412

総合スコア37

Unity

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

0グッド

1クリップ

投稿2016/05/30 09:48

編集2016/05/31 05:36

私は今CSVファイルに書き込むプログラムを書いています。
ソースはこちらです。
ファイルの置き場所はResources/CSVData/bring.csvで
pathは"CSVData/bring"としています。
public void WriteCSV(string path)
{
//一度読み込む
TextAsset csv = Resources.Load(path) as TextAsset;
StringReader reader = new StringReader(csv.text);
StreamWriter sw;
FileInfo fi;
fi = new FileInfo(csv.name);
sw = new StreamWriter(csv.name,true);
Debug.Log(fi);
sw.WriteLine("あかさたな");
sw.Flush();
sw.Close();

}

このプログラムでは、コンソールエラーはないものの、ちゃんと作動していませんでした。新しくCSVファイル(元のCSVファイルのコピー)の中身を見ると変化がありませんでした。
Resources.LoadではなくStreamReader sr = new StreamReader(Application.dataPath + path)を用いたもので行うとUnity上では作動するが、他のプラットフォーム(webPlayer・Android)で動かすと作動しませんでした。

treamReader sr = new StreamReader(Application.dataPath + path)を用いたものとResources.Loadを用いたものでは大きく違うのは理解しているつもりです。

そこでなのですが、
・このプログラムの問題点はどのような問題点があるのか?
・そもそもこのプログラム自体間違いなのか?
・その改善点は?
この三つについてお聞きしたいのです。皆さま何卒よろしくお願いいたします。

追記
・Resourceフォルダの中のCSVファイルの書き込みについての質問です。
・質問の概要はResourceフォルダの中のCSVファイルの内容を書き込みたい(更新したい)というのが質問の概要です。
・できればResourceフォルダから移動させたくはないです。

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

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

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

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

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

shironegi

2016/05/30 12:14

ファイルの読み書きでポイントになるのは,パスの指定方法やファイルの置き場所です. 現状,どこにファイルを置き,WriteCSVの引数にどんなパスを指定して呼び出したのかの記載がないので,回答者が推測しなければならなくなっています.
guest

回答1

0

ベストアンサー

こんにちは.

・問題点
StreamWriterに渡す引数が間違っています.
Resources.LoadはAssets/Resourcesからの「相対パス(拡張子無し)」を受け取る仕様ですが,
StreamWriterに渡すのは「絶対パス」です.
Resources.Loadで一旦読みこんだcsvのcsv.nameで得られるのは「ファイル名(拡張子無し)」なので,StreamWriterが想定している形式になっておらず読み込みに失敗しています.

・プログラムが間違いなのか
書き方,オブジェクトの使用手順等は問題ありませんが,上記のように関数・クラスごとに想定されている引数の形式が異なることを理解して,正しく記述しなければ正常に動作しません.
なお,間違いというわけではありませんが,Resources.Loadで一旦読み込むこと自体が現時点では不要です.

・改善点
まず,StreamReader(Application.dataPath + path)で正しく読み込めるようになったのは,「Application.dataPath + path」で絶対パスが生成されたからでしょう.
なお,これではWebPlayerやAndroidでは上手くいかないとのことですが,
プラットフォームが異なると,書き込める場所に制限があります.
Application.dataPathで得られるのはゲームデータを格納するフォルダのパスなので,プラットフォームによっては読み取り専用になっています.
Application.persistentDataPathを使用すると,実行中にファイル保存可能なパスが得られるので,このパス以下の場所ならば保存可能だと思われます.

このように関数・クラスの特性などを(今回の場合はUnityが生成するパスの特性も含めて),リファレンスマニュアルや書籍・Web等で調べることが第一歩です.

その上で,ログ出力やデバッガでブレーク等して,パスが想定通りの形式で渡されているかを調べながらコーディングを進めるようにすると良いでしょう.
全てが想定通りで正しい形式で動作している事が確認できているのに,なお思ったように動作しない場合は,ここのようなフォーラムに頼ると良いと思います.

▼追伸
今回の場合は,大前提としてResources.LoadはUnityのもの(つまりUnityに特化したもの),StreamWriterはC#に元々あるもの,という成り立ちの違いがあることに気付くと,仕様に違いがあることも納得できるかと思います.こういった点にも意識を向けて取り組んでみて下さい.

参考になれば幸いです.

投稿2016/05/30 12:40

編集2016/05/30 13:10
shironegi

総合スコア119

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問