Читать текстовый файл в объект - PullRequest
0 голосов
/ 15 марта 2019

После нескольких часов борьбы мне нужно прочитать текстовый файл в объект. Мне нужно пропустить первые 15 строк в моем файле, но я продолжаю получать Формат исключения . Пожалуйста, помогите мне. Мне еще нужно многому научиться.

Исключение = => System.FormatException: входная строка была в неправильном формате. в System.Number.StringToNumber (String str, NumberStyles, NumberBuffer & number, информация NumberFormatInfo, логический parseDecimal) в System.Number.ParseInt32 (String s, стиль NumberStyles, информация NumberFormatInfo) в System.Convert.ToInt32 (строковое значение) в PostTicketProject.TicketHelper.LoadData (Ticket [] [] & ticket, String [] fileLines) в D: \ CleanTicket \ PostTicketProject \ PostTicketProject \ Ticket.cs: строка 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);
        }

моя файловая структура ниже

время начала пин-кода = 2019-03-14-01-45-05

время окончания вывода пин-кода = 2019-03-15-02-47-05

ups star date skip = 19

имя оператора = ups

. , .

звездочка = 12

0 [#] pass 0 2019-03-15-02-47-05 userName

0 [#] pass 0 2019-03-15-02-47-05 userName

0 [#] pass 0 2019-03-15-02-47-05 userName

400000 [#] Отсутствует [@] image 1 2019-03-15-02-40-05 userName

8000 [#] Offset [@] image 1 2019-03-15-02-46-10 userName

0 [#] pass 0 2019-03-15-02-47-05 userName

Спасибо за вашу помощь

1 Ответ

2 голосов
/ 15 марта 2019

Я нашел несколько ошибок в вашем коде.Я пойду кину и объясню, что я нахожу странным.

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>

Если порядок отличается, вам нужно настроить индексы в массив данных.

...