Ошибка формата строки при чтении CSV для объекта с LINQ - PullRequest
0 голосов
/ 23 января 2019

Я читаю данные из файла CVS в объект списка C #.Я могу читать только строковые значения.Когда я пытаюсь прочитать числовое значение (в данном случае удваивается), я получаю, что входная строка не была в правильном формате исключения.Кто-нибудь может показать мне, как это преодолеть?Вот код:

класс:

 public class Loan
    {
        string applicationDT;
        string employeeID;
        string employeeName;
        double amount;
        string lonType;

        public void printLoan()
        {
            Console.WriteLine($" employeeName {employeeName} employee Id {employeeID}" +
                $"applicationDate {applicationDT} \namount {amount} loanType {lonType}");
        }

        public static Loan fromCVS(string csvLine)
        {
            string []values = csvLine.Split(',');
            Loan loanRecord = new Loan();
            loanRecord.employeeName = (values[3]);
            loanRecord.employeeID = (values[4]);
            loanRecord.applicationDT = (values[5]);
            loanRecord.amount = Convert.ToDouble(values[6]);
            loanRecord.lonType = (values[7]);
            return loanRecord;
        }
    }

Основной:

static void Main()
{
    List<Loan> loans = File.ReadAllLines(@"C:\Users\0300Test.csv")
                                   .Skip(1)
                                   .Select(v => Loan.fromCVS(v))
                                   .ToList();
    foreach(Loan aLoan in loans)
    {
        aLoan.printLoan();
    }
}

CSV-файл:

"APPROVAL_OFFICER_NAME","APPROVAL_OFFICER_ID","RELATIONSHIP_MANAGER_NAME","EMPLOYEE_NAME","EMPLOYEE_ID","APPLICATION_DATE_TIME","AMOUNT","TYPE_OF_LOAN"
"SAMPLNAME","988803","SAMPLNAME","SAMPLNAME","776667","1/22/2019 11:05:43 AM","321146.00","Top Up With Settlement"
"SAMPLNAME","988803","SAMPLNAME","SAMPLNAME","776667","1/22/2019 9:34:13 AM","90230.00","Top Up With Settlement"
"SAMPLNAME","988803","SAMPLNAME","SAMPLNAME","776667","1/22/2019 12:00:22 AM","5230.00","Top Up without Settlement"

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Видимо, ваша проблема в том, что вы хотите присвоить значение amount

string []values = csvLine.Split(',');
double amount = Convert.ToDouble(values[6]);

Конечно, вы отлаживали код.Что вы видели в качестве значения для values[6]?

Из ваших примеров строки csv это выглядит примерно так: "\"90230.00\""

Так что это строка, начинающаяся и заканчивающаяся строковой кавычкой.Невозможно преобразовать это значение в двойное.

Решение простое: убрать строковые кавычки в начале и конце этого значения.

  amount = Double.Parse(value[6].SubString(1, value[6].Length-2));

Кстати,Вы хотите, чтобы employeeName (и все остальные) были строкой SAMPLENAME или должны быть заключены в кавычки: "SAMPLENAME" (так внутренне "\" SAMPLENAME \ "")?

Если вы хотите удалитьэти начальные и конечные строковые кавычки из всех ваших значений, рассмотрите возможность создания функции расширения для строк.См. Расширение методов расширения:

public static IEnumerable<string> SplitAndRemoveQuotes(this string string)
{
    // TODO: handle null string
    var splitValues = string.Split(',');
    foreach(string splitValue in splitValues)
    {
         // if you are certain every split value starts and ends with string quote
         // TODO: throw exception if not start/end with string quote?
         yield return splitValue.SubString(1, splitValue.Length-2);
    }
}

Так что, если ваша строка имеет формат "\" \ "\" ", (в читаемом формате:" "") возвращаемое значение будет строкойтолько с одной цитатой (")

Использование:

public static Loan fromCVS(string csvLine)
{
    // TODO: exception if csvLine null or empty

    var splitWithoutQuotes = csvLine.SplitAndRemoveQuotes()
        .Skip(2)        // we don't need the first two values
        .Take(5)        // we only need the next five values
        .ToList();
    // TODO: exception if result not 5 items

    return new Loan
    {
        employeNames = splitWithoutQuotes[0],
        ...
        amount = Double.Parse(values[4]);
        ...
    };
}
0 голосов
/ 23 января 2019

Если вы посмотрите на ваши данные

"SAMPLNAME", "988803", "SAMPLNAME", "SAMPLNAME", "776667", "22.01.2009 11:05:43 AM", "321146.00", "Пополнение с расчетом"

Каждый из ваших параметров заключен в кавычки.

Значение values[6] на самом деле "321146.00" с ", окружающим его, поэтому оно не может преобразовать его.

 var x = values[6].Replace("\"", string.Empty);
...