2014-11-08 2 views
5

Mam pliku csv z pola nagłówków, że niektóre z nich zawiera dwa \ trzy wyrazy oddzielone spacją:
enter image description herenie można odczytać pliku CSV z pole nagłówka, które zawierają dwa trzech słów oddzielonych spacjami pomocą CsvHelper bibliotekę

można zobaczyć na powyższym zdjęciu nagłówki pól, które oddzielone spacjami:
„Time of Day”, „Nazwa Process”, „Image path”

Kiedy próbowałem odczytać CSV otrzymałem błąd:
enter image description here

Błąd: "FieldOff" TimeOfDay "nie istnieje w pliku CSV."

Dzieje się tak, ponieważ moja klasa DataRecord nie może zawierać zmiennych ze spacjami.

Chcę znaleźć sposób, aby odczytać plik CSV bez zmiany pliku CSV (ponieważ wywożone przez oprogramowanie firm trzecich)

C# Kod:

public static class Logic 
    { 
     public static StringBuilder GetLoadImagesLogs(String i_FilePathAndName) 
     { 
      StringBuilder o_ConvertedLogs = new StringBuilder(); 

      using (var sr = new StreamReader(i_FilePathAndName)) 
      { 
       var reader = new CsvReader(sr); 
       do 
       { 
        reader.Read(); 
        IEnumerable<DataRecord> records = reader.GetRecords<DataRecord>(); 
       } while (!reader.IsRecordEmpty()); 
      } 


      return o_ConvertedLogs ; 
     } 

     class DataRecord 
     { 
      //Should have properties which correspond to the Column Names in the file 
      //i.e. CommonName,FormalName,TelephoneCode,CountryCode 
      public String TimeOfDay { get; set; } 
      public String ProcessName { get; set; } 
      public String PID { get; set; } 
      public String Operation { get; set; } 
      public String Path { get; set; } 
      public String Result { get; set; } 
      public String Detail { get; set; } 
      public String ImagePath { get; set; } 
     } 
    } 
+0

Dlaczego nie analizować CSV samodzielnie w przeciwieństwie do stosując po wyjęciu z pudełka 3rd biblioteki strona? –

+0

@DJKRAZE, nadal nie poradziłem sobie z tym. najpierw muszę znaleźć rozwiązanie problemu z nagłówkiem pola – E235

+0

czy znasz VB.NET za pomocą 'Microsoft.VisualBasic.FileIO;' Napisałem swój własny parser za pomocą tego prostego zestawu .. Zrób wyszukiwanie google, jak używać ' TextFieldParser' do parsowania .CSV Plik C# Mogę opublikować mój dokładny parser, którego używam/napisałem, musiałbyś wprowadzić drobne zmiany w kodzie, aby pasował do twojego przypadku użycia – MethodMan

Odpowiedz

13

Na podstawie CsvHelper Documentation, możemy osiągnąć kilka pożądanych rezultatów.

1- Ignorując białej przestrzeni z nagłówkami(który moim zdaniem powinien rozwiązać problemu łatwo)

Flaga ta mówi czytelnikowi zignorować białe miejsca w nagłówkach kolumn, gdy dopasowanie do właściwości według nazwy .

reader.Configuration.IgnoreHeaderWhiteSpace = true; 

2- Czytaj Ręcznie

Możemy odczytać każde pole ręcznie jak:

  var reader = new CsvReader(sr); 
      do 
      { 
       reader.Read();     
       var record=new DataRecord(); 

       record.TimeOfDay=reader.ReadField<string>("Time of Day"); 
       record.ProcesName=reader.ReadField<string>("Process Name"); 
       record.PID=reader.ReadField<string>("PID"); 
       record.Operation=reader.ReadField<string>("Operation"); 
       record.Path=reader.ReadField<string>("Path"); 
       record.Result=reader.ReadField<string>("Result"); 
       record.Detail=reader.ReadField<string>("Detail"); 
       record.ImagePath=reader.ReadField<string>("Image Path"); 

      } while (!reader.IsRecordEmpty()); 

3-Class mapowania:

możemy ręcznie map naszą klasę plik csv z użyciem name class mapping, takich jak:

public sealed class DataRecordMap:CsvClassMap<DataRecord> 
    { 
     public DataRecordMap() 
     { 
      Map(m => m.TimeOfDay).Name("Time Of Day"); 
      Map(m => m.ProcessName).Name("Process Name"); 
      Map(m => m.PID).Name("PID"); 
      Map(m => m.Operation).Name("Operation");  
      Map(m => m.Path).Name("Path"); 
      Map(m => m.Result).Name("Result"); 
      Map(m => m.Detail).Name("Detail"); 
      Map(m => m.ImagePath).Name("Image Path"); 
     } 
    } 

wtedy powinniśmy zarejestrować go za pomocą:

reader.Configuration.RegisterClassMap<DataRecordMap>(); 
+1

Dzięki, użyłem twojej pierwszej rady, ale zamiast TrimHeader użyłem: czytnika .Konfiguracja.IgnoreHeaderWhiteSpace = true; i teraz mogę odczytać dane. – E235

+0

Próbuję odczytać nagłówki pliku CSV, ale nie wiem, jak czytać tylko nagłówki. Możesz mi pomóc w tym pytaniu: http: //stackoverflow.com/questions/41340881/reading-only-headers-from-csv –