2016-10-05 4 views
0

Я пытаюсь разобрать CSV модели, но мой IEnumerable всегда null. Что-то не так с этим кодом?Анализ CSV до модели

private IEnumerable<CandidatesDTO> FileToDto(byte[] file) 
{ 
    System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding(); 
    IEnumerable<CandidatesDTO> query = null; 
    string[] separators = { ",", ".", "!", "?", ";", ":", " " }; 
    try 
    { 
     var str = enc.GetString(file); 
     query = from line in str 
       let data = str.Split(separators, StringSplitOptions.RemoveEmptyEntries) 
       select new CandidatesDTO 
       { 
        Id = Int32.Parse(data[0]), 
        Name = data[1], 
        DOB = DateTime.Parse(data[2], CultureInfo.InvariantCulture), 
        Phone = data[3], 
        Email = data[4] 
       }; 
    } 
    catch (Exception ex) 
    { 
     throw new Exception(ex.Message); 
    } 
    return query; 
} 

UPDATE. Я обнаружил, что существует Исключение - «Строка ввода была в некотором формате». Казалось, что некорректный тип передавался со строкой, и это вызывало исключение FormatException.

+0

, пожалуйста, поделитесь своим содержимым файла csv –

+0

Могу ли я предложить вам добавить проект F # в ваше текущее решение. Затем вы можете воспользоваться преимуществами поставщика CSV-типа, как описано здесь http://fsharp.github.io/FSharp.Data/library/CsvProvider.html Помимо этого с F #, быстро и легко определить DTOs –

+0

Файл должен быть пустым. У вас должен быть хотя бы один запрос CandidatesDTO, и у вас есть null. – jdweng

ответ

0

От взгляда на код, я думаю, linq обрабатывает str как IEnumerable<char>. Возможно, вам нужно будет сделать str.Split("\r\n") или независимо от разделителя строк, чтобы вы могли получить каждую строку.

private IEnumerable<CandidatesDTO> FileToDto(byte[] file) 
{ 
    System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding(); 
    IEnumerable<CandidatesDTO> query = null; 
    string[] separators = { ",", ".", "!", "?", ";", ":", " " }; 
    try 
    { 
     var str = enc.GetString(file); 
     query = from line in str.Split(new [] {"\n\r"}, StringSplitOptions.RemoveEmptyEntries) 
       let data = line.Split(separators, StringSplitOptions.RemoveEmptyEntries) 
       select new CandidatesDTO 
       { 
        Id = Int32.Parse(data[0]), 
        Name = data[1], 
        DOB = DateTime.Parse(data[2], CultureInfo.InvariantCulture), 
        Phone = data[3], 
        Email = data[4] 
       }; 
    } 
    catch (Exception ex) 
    { 
     throw new Exception(ex.Message); 
    } 
    return query; 
} 
+0

вы были правы - в нескольких элементах массива есть символы \ n \ r, и это вызвало исключение FormatException. –

 Смежные вопросы

  • Нет связанных вопросов^_^