2017-04-21 27 views
0

我想用CsvHelper將其中有三個水平節的文件解析爲一個嵌套的C#類。我希望從文件返回一行,但我得到多行和不正確的數據。我的測試是使用CSV文件,但是使用以下代碼可以得到相同的結果。所以,完成這個任務是不可能的?我已經看過其他職位,我會自己循環和閱讀部分,但我希望嵌套的C#類將工作。它更符合要求。CSVHelper - 用子類映射單個類,但獲取多個行返回

我相信這個例子會對別人有幫助。

謝謝你的幫助!

邁克

using System.IO; 
using System.Linq; 
using CsvHelper; 
using CsvHelper.Configuration; 

namespace CsvParserExample 
{ 
    public class CsvParser 
    { 
     public static void Main() 
     { 
      using (var stream = new MemoryStream()) 
      { 
       using (var writer = new StreamWriter(stream)) 
       { 
        using (var reader = new StreamReader(stream)) 
         using (var csv = new CsvReader(reader)) 
         { 
          // CsvFile.Name 
          writer.WriteLine("Mike,,"); 

          // Section1.Id, Section2.Comment, Section2.Purpose 
          writer.WriteLine("1234,, I am a comment.,, I am a purpose."); 
          writer.Flush(); 
          stream.Position = 0; 

          csv.Configuration.HasHeaderRecord = false; 
          csv.Configuration.RegisterClassMap<CsvFileMap>(); 
          csv.Configuration.RegisterClassMap<Section1Map>(); 
          csv.Configuration.RegisterClassMap<Section2Map>(); 
          csv.Configuration.RegisterClassMap<Section3Map>(); 

          var recs = csv.GetRecords<CsvFile>().ToList(); 
         } 
       } 
      } 
     } 

     public class CsvFile 
     { 
      public Section1 Section1 { get; set; } 

      public Section2 Section2 { get; set; } 
     } 

     public sealed class CsvFileMap : CsvClassMap<CsvFile> 
     { 
      public CsvFileMap() 
      {     
       References<Section1Map>(m => m.Section1); 
       References<Section2Map>(m => m.Section2); 
      } 
     } 

     public class Section1 
     { 
      public string Name { get; set; } 
     } 

     public sealed class Section1Map : CsvClassMap<Section1> 
     { 
      public Section1Map() 
      { 
       Map(m => m.Name).Index(0); 
      } 
     } 

     public class Section2 
     { 
      public string Id { get; set; } 

      public Section3 Section3 { get; set; } 
     } 

     public sealed class Section2Map : CsvClassMap<Section2> 
     { 
      public Section2Map() 
      { 
       Map(m => m.Id).Index(0); 
       References<Section3Map>(m => m.Section3); 
      } 
     } 

     public class Section3 
     { 
      public string Comment { get; set; } 

      public string Purpose { get; set; } 
     } 

     public sealed class Section3Map : CsvClassMap<Section3> 
     { 
      public Section3Map() 
      { 
       Map(m => m.Comment).Index(0); 
       Map(m => m.Comment).Index(1); 
      }   
     } 
    } 
} 
+1

您好,正在使用'reader':「使用(var csv = new CsvReader(reader))」:) –

+0

@LeiYang他說得對,'reader'用於創建'csv'並且'csv'被使用。 – grek40

+1

好吧,所以我認爲我已經想通了......我轉過身去...... 我創建了一個CsvFile的實例,並使用CsvHelper將實例寫入CSV文件。結果是明智的,但它不是我所期望的: –

回答

0

好了,所以我認爲我已經想通了......我轉過身周圍的事物......我創建CsvFile的實例,並使用CsvHelper到實例寫入到CSV文件。結果是明智的,但這不是我所期望的。

創建文件的內容:Mikie,54321,我是一個新的評論。因此,它將所有的字段放在同一行的類和被引用的類中,從而放在單個記錄中。我預計它會將這個類映射到多行,這代表了我班的各個部分。所以,它看起來像手動解析是要走的路。