2012-05-14 69 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); 
} 
相关问题