2016-10-05 6 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#を使用すると、DTOをすばやく簡単に定義できます –

+0

ファイルは空でなければなりません。クエリに少なくとも1つのCandidatesDTOがあり、nullがあるはずです。 – jdweng

答えて

0

コードを見ると、linqはstrIEnumerable<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を引き起こしました。 –

関連する問題