Я нашел несколько ошибок в вашем коде.Я пойду кину и объясню, что я нахожу странным.
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
s - лучшее решение.
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
равны , все числа и одинаковые верны, но это, вероятно, не то, что вы намереваетесь.Решение состоит в том, чтобы использовать одномерный массив вместо 2-мерного и не выполнять итерацию по подстрокам 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>
Если порядок отличается, вам нужно настроить индексы в массив данных.