将文本文件读入对象
Read text file into object
经过几个小时的努力,我需要将文本文件读入对象。 我需要跳过文件中的前 15 行,但我不断收到 格式异常。请帮我。我还有很多东西要学。
Exception is => System.FormatException: Input string was not in a correct format.
at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
at System.Convert.ToInt32(String value)
at PostTicketProject.TicketHelper.LoadData(Ticket[][]& ticket, String[] fileLines) in D:\CleanTicket\PostTicketProject\PostTicketProject\Ticket.cs:line 139
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);
}
我的文件结构如下
pin 开始日期时间 = 2019-03-14-01-45-05
pin 结束日期时间 = 2019-03-15-02-47-05
ups 明星日期跳过 = 19
运营商名称=ups
。
.
.
星数=12
0 [#]pass 0 2019-03-15-02-47-05 用户名
0 [#]pass 0 2019-03-15-02-47-05 用户名
0 [#]pass 0 2019-03-15-02-47-05 用户名
400000 [#]缺少[@]图片 1 2019-03-15-02-40-05 用户名
8000 [#]偏移[@]图片1 2019-03-15-02-46-10 用户名
0 [#]pass 0 2019-03-15-02-47-05 用户名
感谢您的帮助
我在您的代码中发现了一些错误。我会把它扔掉并解释我觉得奇怪的地方。
for (int i = 0; i< fileLines.Length; i++)
{
while (i > 14)
{
我认为您打算写 if (i > 14)
因为现在一旦您到达第 15 行,您就会陷入无限循环。作为 if
的替代方法,您可以使用 14
.
初始化 i
var data = fileLines[i].Replace(" ", string.Empty).Replace("\t", string.Empty).Split(' ');
我猜您只是想删除行尾 and/or 开头的空格和制表符。在那种情况下,您可以使用 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
都是相同的 [=53] =] 是正确的,但这可能不是您想要的。解决方案是使用一维数组而不是二维数组,而不是遍历 spit 子字符串,而是使用 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>
如果顺序不同,您需要调整数据数组中的索引。
经过几个小时的努力,我需要将文本文件读入对象。 我需要跳过文件中的前 15 行,但我不断收到 格式异常。请帮我。我还有很多东西要学。
Exception is => System.FormatException: Input string was not in a correct format. at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) at System.Convert.ToInt32(String value) at PostTicketProject.TicketHelper.LoadData(Ticket[][]& ticket, String[] fileLines) in D:\CleanTicket\PostTicketProject\PostTicketProject\Ticket.cs:line 139
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);
}
我的文件结构如下
pin 开始日期时间 = 2019-03-14-01-45-05
pin 结束日期时间 = 2019-03-15-02-47-05
ups 明星日期跳过 = 19
运营商名称=ups
。 . .
星数=12
0 [#]pass 0 2019-03-15-02-47-05 用户名
0 [#]pass 0 2019-03-15-02-47-05 用户名
0 [#]pass 0 2019-03-15-02-47-05 用户名
400000 [#]缺少[@]图片 1 2019-03-15-02-40-05 用户名
8000 [#]偏移[@]图片1 2019-03-15-02-46-10 用户名
0 [#]pass 0 2019-03-15-02-47-05 用户名
感谢您的帮助
我在您的代码中发现了一些错误。我会把它扔掉并解释我觉得奇怪的地方。
for (int i = 0; i< fileLines.Length; i++)
{
while (i > 14)
{
我认为您打算写 if (i > 14)
因为现在一旦您到达第 15 行,您就会陷入无限循环。作为 if
的替代方法,您可以使用 14
.
i
var data = fileLines[i].Replace(" ", string.Empty).Replace("\t", string.Empty).Split(' ');
我猜您只是想删除行尾 and/or 开头的空格和制表符。在那种情况下,您可以使用 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
都是相同的 [=53] =] 是正确的,但这可能不是您想要的。解决方案是使用一维数组而不是二维数组,而不是遍历 spit 子字符串,而是使用 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>
如果顺序不同,您需要调整数据数组中的索引。