2015-10-08 7 views
0

Мне нужно разобрать CSV-файл, получить конкретные столбцы и преобразовать значения в double. Мой код ниже работает отлично, если все значения могут быть преобразованы в double :). Но как мне обновить код, если значение будет равно «TRUE»/«FALSE»?Преобразование значения в double с конкретным провайдером в C#

Код:

dt = GetDataTableFromCsv("my_csv.csv"); 
// Gets the column of the dependent/indepent variable 
// I need structure double [][] 
var input = dt.AsEnumerable().Select(r => independentNames.Where(i => dt.Columns.Contains(i)).Select(c => Convert.ToDouble(r.Field<object>(c), provider(???))).ToArray()).ToArray(); 

Пример CSV:

место, значение, TV, IS_NEW, is_home, РЕЙТИНГИ, ...

"1", «0,5», «CNN», «TRUE», «FALSE», «888.77» ....

  • "TV" следует игнорировать, это не в independentNames
  • "TRUE"/"FALSE" => 1,0/0,0
+0

Какое значение 'double' означает' TRUE'? Как насчет 'ТВ'? Почему бы не создать структуру данных с двойными, строковыми и логическими полями? –

+0

Обновленное описание, спасибо! – SpanishBoy

+0

Кажется, что то, что вы пытаетесь сделать, может быть сделано намного проще, но трудно сказать с таким маленьким кодом. Почему бы не создать пользовательский класс, который может обрабатывать все столбцы из CSV, а затем вы можете использовать их, как вам нравится? –

ответ

2

Если все, что вам нужно сделать, это обернуть "TRUE" и "FALSE" в 1.0 и 0.0, разделите логику на свой метод и назовите ее вместо Convert.ToDouble.

Вам все равно придется обрабатывать недопустимые входы, как в этом методе, так и в более широком диапазоне.

double AsDouble(string input) 
{ 
    switch (input) 
    { 
     case "TRUE": return 1.0; 
     case "FALSE": return 0.0; 

     //any other special cases 

     default: return Convert.ToDouble(input); //may still throw! 
    } 
}