经过数小时的努力,我需要将文本文件读入Object。 我需要跳过文件中的前15行,但我一直收到格式异常。请帮我。我还有很多东西要学。
异常是=> System.FormatException:输入字符串的格式不正确。 在System.Number.StringToNumber处(字符串str,NumberStyles选项,NumberBuffer&数字,NumberFormatInfo信息,布尔值parseDecimal) 在System.Number.ParseInt32(String s,NumberStyles样式,NumberFormatInfo信息) 在System.Convert.ToInt32(字符串值) 在D:\ CleanTicket \ PostTicketProject \ PostTicketProject \ Ticket.cs:line 139中的PostTicketProject.TicketHelper.LoadData(Ticket [] []&ticket,String [] fileLines)处
public void LoadData(ref Ticket[][] ticket, string[] fileLines)
{
try
{
//split each line into many columns using single white space, ignore tabs and double white space
var data = fileLines[i].Replace(" ", string.Empty).Replace("\t", string.Empty).Split(' ');
for (int i = 15; i< fileLines.Length; i++)
{
//split each line into many columns using single white space, ignore tabs and double white space
var data = fileLines[i].Replace(" ", string.Empty).Replace("\t", string.Empty).Split(' ');
for (int j = 0; j < fileLines[i].Length; j++)
{
ticket[i][j] = new Ticket //this line throws format exception
{
ErrCode = Convert.ToInt32(data[j]),
DefectName = data[j],
Action = Convert.ToInt32(data[j]),
JudeTime = data[j],
UserName = data[j],
};
}
}
}
catch (FormatException FEx)
{
Console.WriteLine("Exception is => {0}", FEx);
}
catch (NullReferenceException NRefEx)
{
Console.WriteLine("Exception is => {0}", NRefEx);
}
}
读取文本文件的行可以读取和打印内容。似乎没问题
try
{
fileLines = File.ReadAllLines(@"D:\postTicket\repairTicket_post.txt");
}
catch (IOException IOEx)
{
Console.WriteLine("Failed to load file... Exception is => {0}", IOEx);
}
我的文件结构在下面
引脚开始日期时间= 2019-03-14-01-45-05
引脚结束日期时间= 2019-03-15-02-47-05
ups star date skip = 19
操作员姓名= ups
。 。
星号= 12
0 [#]通过0 2019-03-15-02-47-05用户名
0 [#]通过0 2019-03-15-02-47-05用户名
0 [#]通过0 2019-03-15-02-47-05用户名
400000 [#]缺少[@]图片1 2019-03-15-02-40-05用户名
8000 [#] Offset [@] image 1 2019-03-15-02-46-10 userName
0 [#]通过0 2019-03-15-02-47-05用户名
感谢您的所有帮助
答案 0 :(得分:2)
我在您的代码中发现了一些错误。我去扔它,解释一下我发现的奇怪之处。
for (int i = 0; i< fileLines.Length; i++)
{
while (i > 14)
{
我认为您打算写if (i > 14)
,因为现在到达第15行时,您将陷入无限循环。作为if
的替代方法,您可以只用i
初始化14
。
var data = fileLines[i].Replace(" ", string.Empty).Replace("\t", string.Empty).Split(' ');
我猜您只是想删除行首和/或结尾的空格和制表符。在那种情况下,您可以使用Trim()
/ TrimStart()
/ TrimEnd()
,但是在这种情况下,您的Replace
是最好的解决方案,我可能会误会。
for (int j = 0; j < fileLines[i].Length; j++)
在此for循环中,您想循环遍历data
中的拆分字符串,但是您使用j < fileLines[i].Length
作为条件。这将针对行中的字符数量而不是拆分子字符串的数量运行for循环。为此,您需要像这样data
遍历i < data.Length
数组。
ticket[i][j] = new Ticket
{
ErrCode = Convert.ToInt32(data[j]),
DefectName = data[j],
Action = Convert.ToInt32(data[j]),
JudeTime = data[j],
UserName = data[j],
};
在此细分中,您将创建Ticket
。问题在于,首先您没有创建很可能导致NullReferenceException
的内部数组,其次您始终使用相同的子字符串。在您的ErrCode
,DefectName
,Action
,JudeTime
和UserName
不太可能是所有数字相同的情况下,是正确的,但这可能不是您想要的。解决方案是使用一维数组而不是二维数组,而不是遍历唾液子串,而是使用data
数组在那里创建对象。
更新的代码:
public void LoadData(ref Ticket[] ticket, string[] fileLines)
{
try
{
//to read and store the text file data in the ticket object
ticket = new Ticket[fileLines.Length];
for (int i = 14; i < fileLines.Length; i++)
{
//split each line into many columns using single white space, ignore tabs and double white space
var data = fileLines[i].Replace(" ", string.Empty).Replace("\t", string.Empty).Split(' ');
ticket[i] = new Ticket
{
ErrCode = Convert.ToInt32(data[0]),
DefectName = data[1],
Action = Convert.ToInt32(data[2]),
JudeTime = data[3],
UserName = data[4],
};
}
}
catch (FormatException FEx)
{
Console.WriteLine("Exception is => {0}", FEx);
}
catch (NullReferenceException NRefEx)
{
Console.WriteLine("Exception is => {0}", NRefEx);
}
}
这假定行的格式为:
<ErrCode> <DefectName> <Action> <JudeTime> <UserName>
如果顺序不同,则需要将索引调整到数据数组中。