2012-05-14 66 views
2

我正在使用TextReader讀取製表符分隔文件的每一行。 對於它讀取的每一行,我在選項卡上分割並填充字符串數組。 然後,我可以訪問字符串數組中的特定位置以獲取值。製表符分隔的txt文件從字符串數組中讀取int值

這對字符串非常適用:userWorkload.SSN = arrColumns [0];
但是,當我嘗試將其中一列轉換爲int時,我在運行時收到錯誤消息:userWorkload.contactHours = Convert.ToInt32(arrColumns [9]);

這裏是我的代碼:

List<UserWorkload> userWorkloads = new List<UserWorkload>(); 
TextReader tr = File.OpenText("fall11-tab.txt"); 
string strLine = string.Empty; 
string[] arrColumns = null; 
while ((strLine = tr.ReadLine()) != null) 
{ 
    UserWorkload userWorkload = new UserWorkload(); 

    arrColumns = strLine.Split('\t'); 
    userWorkload.SSN = arrColumns[0]; 
    userWorkload.contactHours = Convert.ToInt32(arrColumns[9]);  

    userWorkloads.Add(userWorkload); 
} 

和UserWorkload類只包含簡單的getter/setter方法:

class UserWorkload 
{ 
    public string SSN { get; set; } 
    public int contactHours { get; set; } 
} 

這是我的錯誤:
未處理的異常:System.FormatException:輸入字符串沒有一個正確的格式。
在System.Number.StringToNumber(字符串str的NumberStyles選項,NumberBuffer &數的NumberFormatInfo信息,布爾parseDecimal)
在System.Number.ParseInt32(字符串s的NumberStyles風格的NumberFormatInfo信息)
在System.Convert。 ToInt32(字符串值)
在Snyder5Creator.InputFileReader.buildRowList()在C:\用戶\ baxter.NET \文件\的Visual Studio 2010 \項目\ User5Creator \ User5Creator \ InputFileReader.cs:線31
在Snyder5Creator.Program。 Main(String [] args)在C:\ Users \ baxter.NET \ Documents \ Visual Studio 2010 \ Projects \ User5Creator \ Snyder5Creator \ Program.cs中:line 24

第31行是:userWorkload.contactHours = Convert.ToInt32(arrColumns [9]);

任何幫助,將不勝感激。

+0

你可以發佈該文本文件嗎?很明顯,它正在炸燬這個元素,但我需要看到這個元素更有幫助。不過,我可能會使用TryParse()作爲開始。 – Killnine

+0

你是對的,它最終成爲隱藏在其中一行中的不良數據。 感謝TryParse()提示,現在一切正常。 – Baxter

回答

2

您可能在一個或多個記錄中有無效數據。如果你可以忽略這些錯誤,那麼你可以使用int.TryParse:

int parsedNumber; 
userWorkload.contactHours = int.TryParse(arrColumns[9], out parsedNumber) ? parsedNumber : -1; 
1

把它包裝在try-catch中。

List<UserWorkload> userWorkloads = new List<UserWorkload>(); 
TextReader tr = File.OpenText("fall11-tab.txt"); 
string strLine = string.Empty; 
string[] arrColumns = null; 
while ((strLine = tr.ReadLine()) != null) 
{ 
    UserWorkload userWorkload = new UserWorkload(); 

    arrColumns = strLine.Split('\t'); 
    userWorkload.SSN = arrColumns[0]; 
    if(!int.TryParse(arrColumns[9], out userWorkload.contactHours) 
    { 
     //Throw something like InvalidArgumentException here or set to a safe value (-1?) 
    }  

    userWorkloads.Add(userWorkload); 
} 
相關問題