Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

FileHelper escape delimiter

I am using FileHelper 2.0 for parsing my csv data. Is there any option that filehelper can properly handle escaped delimiter? That it can identify field as data and not as delimiter.

Our csv format: escape comma (,) with \,

Example data:

name, lastname

nico\,le,opeka

Current code:

[DelimitedRecord(",")] 
public class contactTemplate
{
  public string firstName;
  public string lastName;
}

How can I get firstName = nico,le and lastName = opeka. FileHelpers splits by comma , and now it returns:

firstName -> nico\

lastName -> ,le,opeka

like image 308
broadband Avatar asked Aug 30 '13 09:08

broadband


1 Answers

First, you need to make all of your fields optionally quoted.

[DelimitedRecord(",")] 
public class contactTemplate
{
  [FieldQuoted('"', QuoteMode.OptionalForBoth)]
  public string firstName;
  [FieldQuoted('"', QuoteMode.OptionalForBoth)]
  public string lastName;
}

Then you need to quote all the fields which contain an escaped character. You can use a BeforeReadRecord event for this.

FileHelperEngine engine = new FileHelperEngine(typeof(contactTemplate)); 
engine.BeforeReadRecord += BeforeEvent; 

private void BeforeEvent(EngineBase engine, BeforeReadRecordEventArgs e)
{
    if (e.RecordLine.Contains("\"))
    {
        string[] parts = SplitStringRespectingEscapeCharacter(eRecordLine);
        parts = QuoteAnyPartsWhichContainEscapeCharacter(parts);
        parts = RemoveAnyEscapeCharacters(parts);
        e.RecordLine = parts.Join;
    } 
}

You can find some code to get you started on your customized split function here.

like image 150
shamp00 Avatar answered Sep 19 '22 23:09

shamp00