2010-01-05 10 views
5

Sto cercando di caricare un file CSV (delims sono ';' e citazioni sono '"').Come definire un valore predefinito per un campo di una classe elemento FileHelpers

ho creato con successo tutto (lo strumento wizard è impressionante), ma c'è una cosa che non riesco a trovare una soluzione per.

Fondamentalmente, ho una colonna integer (System.Int32). In teoria maggior dei record avrà un valore intero positivo in quella colonna.A volte, tuttavia, potrei incontrare un valore "N/A" in quella colonna.Che cosa voglio ottenere, è FileHelpers assegnare un valore predefinito (-1 funziona bene), quando incontra "N/A" in quella colonna.

Qualcuno sa se questo è possibile?

PS: Potrebbe essere necessario fare lo stesso per un campo System.DateTime (potrebbe anche avere "N/A" a volte).

risposta

5

Il modo migliore che ti viene in mente di fare quello che vuoi sarebbe utilizzare l'attributo FieldConverter su quei campi e creare classi di convertitore personalizzate che assegnano il valore predefinito che vuoi che il campo abbia.

È necessario creare una classe che eredita ConverterBase e quindi fornire implementazioni per i due metodi virtuali, StringToField() e FieldToString().

Nel metodo FieldToString(), verificherete se la stringa è uguale a "N/A". Se lo è, restituire il valore predefinito desiderato.

Avrete bisogno di due classi diverse, una che può gestire Int32 e una che può gestire DateTime.

La documentazione FileHelpers ha un esempio di come eseguire questa operazione. Link

+0

Aha! Esattamente quello che volevo! – Paulius

5

Come Brandon detto u necessità di utilizzare questo convertitore

// In your class 
[FieldConverter(typeof(NoValueConverter))] 
public int Number; 

// Te Converter 
public class NoValueConverter : ConverterBase 
{ 
    public override object StringToField(string sourceString) 
    { 
     if (sourceString.Trim().ToUpper() == "N/A") 
     return -1; // or int.MinValue; 
     else 
     return Integer.Parse(sourceString); 
    } 

    public override string FieldToString(object fieldValue) 
    { 
     return fieldValue.ToString(); 
    } 

} 

Siamo lieti che u è piaciuto il mago :) (stiamo lavorando una caratteristica fredda rilevamento automatico per renderlo più facile per creare la classe di mappatura)

+0

poiché da una parola chiave LINQ, è necessario utilizzare un nome di parametro diverso o non importa? –

+0

Hai ragione Matt :) modificato ora, grazie Forse devo aggiornare il codice di esempio della libreria che è stato creato per .net 2.0 prima da dove una parola chiave riservata. – MarcosMeli

Problemi correlati