2014-11-08 11 views
5

ho un file CSV con il campo di intestazioni che alcuni di essi contiene due \ tre parole separate con lo spazio:
enter image description hereImpossibile leggere il file CSV con campo di intestazione che contiene due tre parole separate da spazi utilizzando CsvHelper biblioteca

Si può vedere nella foto sopra le intestazioni di campo che separavano con spazi:
"Ora del giorno", "Nome processo", "Percorso Immagine"

Quando ho provato a leggere il CSV ho ricevuto un errore:
enter image description here

L'errore è: "Fields 'TimeOfDay' non esiste nel file CSV."

Questo perché la mia classe DataRecord non può contenere variabili con spazi.

Voglio trovare un modo per leggere il file CSV senza modificare il file CSV (perché viene esportata da software di terze parti)

codice C#:

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

Perché non analizzare il CSV da soli invece di utilizzare un fuori biblioteca partito 3 ° scatola? –

+0

@DJKRAZE, non l'ho ancora gestito. prima ho bisogno di trovare una soluzione per il problema dell'intestazione di campo – E235

+0

hai familiarità con VB.NET usando 'Microsoft.VisualBasic.FileIO; 'Ho scritto il mio parser usando questo semplice assembly .. fai una ricerca su google su come usare' TextFieldParser' per analizzare .CSV File C# Posso postare il mio parser esatto che uso/scritto dovresti apportare piccole modifiche nel codice per adattarsi al tuo caso d'uso – MethodMan

risposta

13

Sulla base di CsvHelper Documentation, ci sono diversi modi in cui possiamo ottenere i risultati desiderati.

1- Ignorando spazio bianco da intestazioni(che a mio avviso dovrebbe risolvere il problema facilmente)

Questo flag dice al lettore di ignorare gli spazi bianchi nelle intestazioni in caso di corrispondenza delle colonne alle proprietà per nome .

reader.Configuration.IgnoreHeaderWhiteSpace = true; 

2- leggere manualmente

Siamo in grado di leggere ogni campo, come manualmente:

  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 Mapping:

siamo in grado di mappare manualmente la nostra classe di file CSV usando name class mapping come:

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"); 
     } 
    } 

allora dovremmo registrarlo utilizzando:

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

Grazie, ho usato il tuo primo consiglio ma invece di TrimHeader che ho usato: reader .Configurazione.IgnoreHeaderWhiteSpace = true; e ora posso leggere i dati. – E235

+0

Sto provando a leggere le intestazioni del file csv ma ​​non so leggere solo le intestazioni. Puoi aiutarmi con questa domanda per favore: http: //stackoverflow.com/questions/41340881/reading-only-headers-from-csv –

Problemi correlati