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

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

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

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

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Q&A

解決済

2回答

9288閲覧

【unity】【c#】【csv】dictionaryを用いて正しくkey,valueの値をセットしたい

kadyu

総合スコア14

CSV

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

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

0グッド

1クリップ

投稿2016/07/10 16:10

###前提・実現したいこと
unitydで以下のCSVを読み込んでdictionaryを用いて連想配列にしようと思いました。
1回目foreachのでkeyを宣言し2回目のforeachで値を上書きして出力しようと思いましたがうまくいきませんでした。
key,valueの値が正しく入るようにするにはどうすればいいでしょうか?

csv

1HP,IP,Power,defense,Brainpower,Lack,Speed 230,8,10,6,6,6,9

###発生している問題

イメージ説明

###該当のソースコード

C#

1using UnityEngine; 2using System.Collections; 3using System.IO; 4using System.Collections.Generic; 5using System.Linq; 6using System.Text; 7using System.Threading; 8 9public class readCSV : MonoBehaviour 10{ 11 int count = 1; 12 // Use this for initialization 13 void Start() 14 { 15 //TextBox1に入力されている文字列から一行ずつ読み込む 16 //文字列(statusに入力された文字列)からStringReaderインスタンスを作成 17 TextAsset csv = Resources.Load("CSV/status") as TextAsset; 18 StringReader reader = new StringReader(csv.text); 19 Dictionary<string, int> map = new Dictionary<string, int>(); 20 //ストリーム(今回はCSV)の末端まで繰り返す 21 while (reader.Peek() > -1) 22 { 23 string line = reader.ReadLine(); 24 string[] splitLine = line.Split(','); 25 if (count == 1) 26 { 27 28 foreach (string stData in splitLine){ 29 map.Add(stData, 0); 30 } 31 count++; 32 }else{ 33 foreach (string stData in splitLine) 34 { 35 map["{0}"] = int.Parse(stData); 36 } 37 } 38 } 39 foreach (KeyValuePair<string, int> pair in map) 40 { 41 Debug.Log(pair.Key + " : " + pair.Value); 42 } 43 } 44}

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

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

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

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

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

amay077

2016/07/10 17:21

CSVをどのような連想配列にしたいのでしょう? HP,IP,Power,defense,Brainpower,Lack,Speed 30,8,10,6,6,6,9 を、具体的にこうしたい姿(期待値)を書いてみてください。
kadyu

2016/07/11 13:42

HP:30,IP:8,Power:10,defense:6,Brainpower:6,Lack:6,Speed:9のようにしたいと考えていました
guest

回答2

0

map["{0}"] = int.Parse(stData); これが問題です。
"{0}" という文字列をキーとして入れてしまっています。
map[stData] = int.Parse(stData); とすればうまくいくはずです。

また、最初に Add されていますが、これは必要ありませんよ。
代入時にキーが無ければ作られますから、ばっさり切ってしまって構いません。

C#

1while (reader.Peek() > -1) 2{ 3 string line = reader.ReadLine(); 4 string[] splitLine = line.Split(','); 5 foreach (string stData in splitLine) 6 { 7 map[stData] = int.Parse(stData); 8 } 9}

投稿2016/07/10 22:43

編集2016/07/10 22:48
Zuishin

総合スコア28656

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

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

kadyu

2016/07/11 13:46

>代入時にキーが無ければ作られますから、ばっさり切ってしまって構いません。 なるほど、まだC#のdictionaryに慣れていないのでこれから勉強していこうと思います。 回答ありがとうございました!
guest

0

ベストアンサー

質問に記述されているコードでは、全ての数値パラメータは**{0}Keyに入れる形になってしまっています。
そのため2行目のCSVファイル最後の数値である
9**の値が{0}に入る結果になっています。

ストリームからデータを取得するフェイズとデータを変数に入れるフェイズを別のものにするとわかりやすいのではないでしょうか。
以下のコードの例では、一度ストリームから取得した文字列の配列を__lineStrList__に格納してから、後程Dictionaryに格納する形をとっています。

csharp

1using UnityEngine; 2using System.Collections; 3using System.IO; 4using System.Collections.Generic; 5using System.Linq; 6using System.Text; 7using System.Threading; 8 9public class readCSV : MonoBehaviour 10{ 11 void Start() 12 { 13 //TextBox1に入力されている文字列から一行ずつ読み込む 14 //文字列(statusに入力された文字列)からStringReaderインスタンスを作成 15 TextAsset csv = Resources.Load( "CSV/status" ) as TextAsset; 16 StringReader reader = new StringReader( csv.text ); 17 List<string[]> lineStrList = new List<string[]>(); 18 19 //ストリーム(今回はCSV)の末端まで繰り返す 20 while( reader.Peek() > -1 ) 21 { 22 string line = reader.ReadLine(); 23 lineStrList.Add( line.Split( ',' ) ); 24 } 25 26 Dictionary<string, int> map = new Dictionary<string, int>(); 27 // TODO: CSVファイルの各行の列数が同じである前提の作りになっています。 28 for( int i = 0; i < lineStrList[ 0 ].Length; i++ ) 29 { 30 string key = lineStrList[ 0 ][ i ]; 31 int value = int.Parse( lineStrList[ 1 ][ i ] ); 32 map.Add( key, value ); 33 } 34 35 foreach( KeyValuePair<string, int> pair in map ) 36 { 37 Debug.Log( pair.Key + " : " + pair.Value ); 38 } 39 } 40 41} // class readCSV

ご参考になればと思います。

投稿2016/07/10 22:31

urahimono

総合スコア714

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

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

kadyu

2016/07/11 13:47

ListとDictionaryの組み合わせがとても分かりやすく、理解しやすい回答だったのでベストアンサーにいたしました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問