2017-03-23 2 views
2

Je dispose d'un fichier csv que je suis analyse avec FileHelpers et moi avons une situation où les deux une citation et une virgule peut apparaître dans un champ:FileHelpers guillemet et une virgule dans les champs

Virgule:

323,"PC","28/02/2014","UNI001","5000",0,"Return","Returned Goods, damaged",88.00,15.40,"T1","N",0.00,"R","-", 

Citation

148,"SI","13/01/2014","CGS001","4000",1,"5","17" Monitor",266.00,45.39,"T1","Y",311.39,"R","-", 

Ma classe est:

[DelimitedRecord(",")] 
public class Transaction 
{ 
    public int TRAN_NUMBER; 
    [FieldQuoted('"', QuoteMode.OptionalForBoth)] 
    public string TypeText; 
    [FieldQuoted('"', QuoteMode.OptionalForBoth)] 
    public string DATE; 
    [FieldQuoted('"', QuoteMode.OptionalForBoth)] 
    public string TransactionAccount; 
    [FieldQuoted('"', QuoteMode.OptionalForBoth)] 
    public string NOMINAL_CODE; 

    public int DEPT_NUMBER; 

    [FieldQuoted('"', QuoteMode.OptionalForBoth)] 
    public string INV_REF; 

    [FieldQuoted('"', QuoteMode.OptionalForBoth)] 
    public string DETAILS; 

    public string NET_AMOUNT; 
    public string TAX_AMOUNT; 
    [FieldQuoted('"', QuoteMode.OptionalForBoth)] 
    public string TaxCodeName; 
    [FieldQuoted('"', QuoteMode.OptionalForBoth)] 
    public string PAID_FLAG; 

    public string AMOUNT_PAID; 

    [FieldQuoted('"', QuoteMode.OptionalForBoth)] 
    public string VatReconText; 
    [FieldQuoted('"', QuoteMode.OptionalForBoth)] 
    public string BankReconText; 

    public string RECON_DATE; 
} 

J'ai trouvé ce fil FileHelpers nested quotes and commas - parsing error

engine.BeforeReadRecord += (sender, args) => 
args.RecordLine = args.RecordLine.Replace(@"""", "'"); 

Mais il aide uniquement avec des citations apparaissant problème et non les virgules.

Est-ce que ces deux problèmes peuvent être résolus avec FileHelpers ou je devrais chercher une solution alternative?

+1

Ma propre méthode de résolution consistait à analyser des lignes, puis si la ligne ne répondait pas au nombre de champs requis, + la ligne ci-dessous, etc. – BugFinder

Répondre

0

Vous pouvez implémenter un événement BeforeReadRecord pour 'corriger' vos lignes incorrectes.

FileHelperEngine engine = new FileHelperEngine<Transaction>(); 
engine.BeforeReadRecord += BeforeEvent; 

private void BeforeEvent(EngineBase engine, BeforeReadRecordEventArgs e) 
{ 
    var line = e.RecordLine; 

    // you have to write the following replacement routine... 
    var fixedLine = ReplaceEmbeddedCommasAndQuotesWithSomethingDifferent(line); 

    e.RecordLine = fixedLine; // replace the line with the fixed version 
} 

Et après avoir lu les enregistrements dans vous pourriez les traiter pour inverser le processus de remplacement pour les réparer.

Si vous préférez définir toute la logique dans la classe FileHelpers elle-même, vous pouvez implémenter INotifyRead<Transaction> au lieu d'utiliser l'événement.