Net Core Ошибка проверки файлов парсера на отсутствие текста - PullRequest
0 голосов
/ 22 сентября 2018

Я написал анализатор файлов, используя этот метод.

Образец текста:

1,Joe,CA,58,2
2,Matt,TX,63,5

-

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace ParseTest
{
    public class Customer
    {

        public class CustomerData
        {
            // These are the column names in PlatypusN.csv:
            public int CustomerId { get; set; }
            public string CustomerName { get; set; }
            public string CustomerState { get; set; }
            public int ProductId { get; set; }
            public int QuantityBought { get; set; }
        }

        public List<CustomerData> GetCustomer(string filename)
        {
            List<CustomerData> customerdata = new List<CustomerData>();
            string CustomerBase = filename;
            String fileToLoad = String.Format(CustomerBase);

            using (StreamReader r = new StreamReader(fileToLoad))
            {
                string line;
                while ((line = r.ReadLine()) != null)
                {
                    string[] parts = line.Split(',');
                    // Skip the column names row
                    if (parts[0] == "id") continue;
                    CustomerData dbp = new CustomerData();
                    dbp.CustomerId = Convert.ToInt32(parts[0]);
                    dbp.CustomerName = parts[1];
                    dbp.CustomerState = parts[2];
                    dbp.ProductId = Convert.ToInt32(parts[3]);
                    dbp.QuantityBought = Convert.ToInt32(parts[4]);
                    customerdata.Add(dbp);
                }
            }
            return customerdata;
        }
    }
}

Основной метод для тестирования:

    static void Main()
    {
        Customer customer = new Customer();
        string filename = @"C:\Users\Desktop\Parsefile\sample.txt";

        var test = customer.GetCustomer(filename);
        Console.ReadKey();
    }

Теперь, что происходит в ситуации, если образец файла содержит меньше данных в одной строке

Образец текста:

1,Joe,CA,58   // missing one number
2,Matt,TX,63,5

Ошибка заключается в следующем: System.IndexOutOfRangeException: 'Индекс находился за пределами массива.'

dbp.QuantityBought = Convert.ToInt32(parts[4]);

Какой самый лучший способ решить эту проблему, я не хочу использовать неэффективный код, подобный этому?

if (parts.Length - 1 >= 1)
dbp.CustomerName = parts[1];
.....
if (parts.Length - 1 >= 4)
dbp.QuantityBought = Convert.ToInt32(parts[4]);

1 Ответ

0 голосов
/ 22 сентября 2018

Просто перехватите исключение, чтобы проигнорировать строку и продолжить анализ:

while ((line = r.ReadLine()) != null)
{
    try
    {
        string[] parts = line.Split(',');
        // Skip the column names row
        if (parts[0] == "id") continue;

        CustomerModel dbp = new CustomerModel
        {
            CustomerId = Convert.ToInt32(parts[0]),
            CustomerName = parts[1],
            CustomerState = parts[2],
            ProductId = Convert.ToInt32(parts[3]),
            QuantityBought = Convert.ToInt32(parts[4])
        };

        allFileCustomerData.Add(dbp);
    }
    catch (FormatException ex)
    {

    }
    catch (Exception ex)
    {
        throw;
    }
}
...