2015-03-31 82 views
0

我有低於該文本文件:劈裂成線然後到變量

001妙蛙種子45 49 49 65 65 45草毒
002 Ivysaur 60 62 63 80 80 60草毒
003妙蛙花80 82 83個100個100個80個草毒
004火龍39 52 43 60 50 65火焰
005火恐龍58 64 58 80 65 80火焰

我寫這片代碼將其分成行然後變成變量,但它拒絕工作,我的道歉,如果我在錯誤的地方問這個。 (統一C#問題)。

var lines = textFile.text.Split("\n"[0]); 
    allMonsters = new Monsters[lines.Length]; 
    List<string> lineSplit = new List<string>(); 
    for (int i = 0; i < lines.Length; i++) { 
     Debug.Log(lines[i]); 

     lineSplit.Clear(); 
     lineSplit = lines[i].Split(' ').ToList(); 

     int ID     = int.Parse(lineSplit[0]); 
     string Name    = lineSplit[1].ToString(); 
     float HP    = float.Parse(lineSplit[2]); 
     float ATK   = float.Parse(lineSplit[3]); 
     float DEF   = float.Parse(lineSplit[4]); 
     float SPATK    = float.Parse(lineSplit[5]); 
     float SpDEF    = float.Parse(lineSplit[6]); 
     float speed    = float.Parse(lineSplit[7]); 
     FirstType Ft  = (FirstType)System.Enum.Parse(typeof(FirstType),lineSplit[8]); 
     SecondType ST =   (SecondType)System.Enum.Parse(typeof(SecondType),lineSplit[9]); } 

該代碼適用於第一行,但隨後在此代碼的第二次運行我得到null引用對象錯誤,請幫助我。

請注意,變量被分配給它們,以便它們在代碼之後不被覆蓋。

編輯:LineSplit變量超過1200個元素長,所以我不認爲團結正確清理數組可能是這個問題?

+0

你確定它正在分割線嗎?我將首先註銷每次嘗試解析的行,以便您可以直接看到它正在處理的內容。我想在這一點上,它將整個文件作爲一個單獨的一行讀入。當你說它適用於第一行但不適用於後續行時,我就會想到這一點。如果您在調試日誌中獲得有關如何分析行的更多信息,可以幫助我們找出問題所在。 – CShannon 2015-03-31 22:03:41

+1

你確定這些行以'\ n'結尾嗎?它也可能包含'\ r',這樣在解析時會干擾結果的完整性。 (我花了很長時間才意識到這是我的一個代碼中的錯誤)。我不知道C#,但如果支持,請嘗試使用正則表達式(「$」=行尾)分割或全部替換「\ r」。 – s3lph 2015-03-31 22:03:58

+0

@Raymond Tunstill你可以檢查女巫的迭代和行你得到異常? – 2015-03-31 22:10:17

回答

2

我不確定第二次迭代,但在第4次迭代線上004 Charmander 39 52 43 60 50 65 Fire只有9個參數(通過分割空間)並且您使用的是lineSplit[9],所以您會得到NullPointerException

+0

我已經刪除了這個,我仍然得到一個錯誤 – 2015-03-31 22:07:44

+0

我認爲這可能是問題的一部分,但不是全部。當沒有提供輔助類型時,您應該可以在文件中檢查一個佔位符值。例如「004 Charmander 39 52 43 60 50 65 Fire NULL」。然後在你的ST中,如果它是NULL,你可以根據需要填充它。 – CShannon 2015-03-31 22:08:47

+0

謝謝,我會這樣做 – 2015-03-31 22:12:24

0

使用文本文件時,換行通常伴隨着回車。 嘗試

var lines = textFile.text.Split(new string[]{"\r\n"}, System.StringSplitOptions.None); 

在第一行。