Csvhelper: рдкрд╛рд░реНрд╕рд┐рдВрдЧ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢

рдХреЛ рдирд┐рд░реНрдорд┐рдд 3 рдЬреБрд▓ре░ 2014  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: JoshClose/CsvHelper

рдореИрдВрдиреЗ рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рджреЗрдЦрд╛ рдЬреЛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдореБрджреНрджреЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдкрд░реНрдпрд╛рдкреНрдд рд▓рдЪреАрд▓рд╛рдкрди рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореБрдЭреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреЗрд╣рддрд░ рд╕реНрддрд░ рдХрд╛ рд╡рд┐рд╡рд░рдг рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХреБрдЫ рд▓рд┐рдЦрдирд╛ рд╣реИ:

``` рд╕реА#
рд╡рд░ рдИ = рдирдИ рд╕реВрдЪреА();
csvReader.Configuration.ReadingExceptionCallback = (рдЙрджрд╛, рдкрдВрдХреНрддрд┐) =>
{
foreach (ex.Data.Values тАЛтАЛтАЛтАЛрдореЗрдВ var рддреНрд░реБрдЯрд┐)
{
var рдЬрд╛рдирдХрд╛рд░реА = рддреНрд░реБрдЯрд┐ред ToString ()ред рд╕реНрдкреНрд▓рд┐рдЯ (рдирдпрд╛ [] { "\ n", "\ r \ n"}, StringSplitOptions.RemoveEmptyEntries);
рд╡рд░ рдореВрд▓реНрдп = рдЬрд╛рдирдХрд╛рд░реА [4]ред рд╡рд┐рднрд╛рдЬрд┐рдд (':') [1]ред рдЯреНрд░рд┐рдо ();
рд╡рд░ рдХреНрд╖реЗрддреНрд░ = рдЬрд╛рдирдХрд╛рд░реА [3]ред рд╡рд┐рднрд╛рдЬрд┐рдд (':') [1]ред рдЯреНрд░рд┐рдо ();
e.Add(string.Format("рдкрдВрдХреНрддрд┐ {1} рдореЗрдВ рдорд╛рди {0} рдирд╣реАрдВ рдкрдврд╝ рд╕рдХрд╛, рдлрд╝реАрд▓реНрдб {2}ред",
рдорд╛рди, рдкрдВрдХреНрддрд┐ред рдкрдВрдХреНрддрд┐, рдлрд╝реАрд▓реНрдб));
}
};
// рд╡реЗрдмрдкреЗрдЬ рдкрд░ рдИ рд▓реМрдЯрд╛рдПрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП JSON рдХреЗ рд░реВрдк рдореЗрдВ)

This is relatively ok. It gives information where exactly parsing error has occured. However, as you can see, digging this information is ugly since I have to parse string to get the value and the field name. It would be nice if this information could be exposed via properties so that I could write something like this:

``` c#
csvReader.Configuration.ReadingExceptionCallback = (ex, row) =>
{
    foreach (var error in row.Errors)
    {
        e.Add(string.Format("Could not read value {0} in row {1}, field {2}.",
            error.Value, error.Row, error.FieldName));
    }
};

рд▓реЗрдХрд┐рди рдКрдкрд░ рдареАрдХ рд╣реИ... рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрд░реЛрдз рдХреНрдпрд╛ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рднреА рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд╡рд┐рдлрд▓ рдХреНрдпреЛрдВ рд╣реБрдИред
рдорд╛рди рд▓реЗрдВ рдХрд┐ рдХреЛрдИ рдлрд╝реАрд▓реНрдб рдХреЗрд╡рд▓ "рд▓рд╛рд▓" рдпрд╛ "рдиреАрд▓рд╛" рдорд╛рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ "рдкреАрд▓рд╛" рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЗрд╕реЗ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

c# // in the MyClassMap : CsvClassMap<MyClass> class Map(x => x.Color).ErrorMessage("Accepted values are 'Red' and 'Blue'"); ... // in the ReadingExceptionCallback e.Add(string.Format("Could not read value {0} in row {1}, field {2}. {3}", error.Value, error.Row, error.FieldName, error.Message));

рдпрд╣ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛рдкрди рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдЧрд╛ред

рдореБрдЭреЗ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдЬрд╛рдирдиреЗ рджреЗрдВред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдпрд╣ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░ рд╣реИред рдореИрдВ рдЗрд╕реЗ рдЕрднреА рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реВрдБрдЧрд╛ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЗрд╕ рдкрд░ рдЧрд╣рд░рд╛рдИ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдБрдЧрд╛ред

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдпрд╣ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░ рд╣реИред рдореИрдВ рдЗрд╕реЗ рдЕрднреА рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реВрдБрдЧрд╛ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЗрд╕ рдкрд░ рдЧрд╣рд░рд╛рдИ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдБрдЧрд╛ред

рдмрд╕ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрд░реЛрдз рдХреЛ рджреВрд╕рд░рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред

рдЪреВрдБрдХрд┐ рдореИрдВ рдпрд╣рд╛рдБ рд╣реВрдБ рддреЛ рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдзрдиреНрдпрд╡рд╛рдж рдХрд╣рдирд╛ рдЪрд╛рд╣реВрдБрдЧрд╛ред CsvHelper рдЗрддрдиреЗ рд╕рд╛рд░реЗ рд╕реНрддрд░реЛрдВ рдкрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред

3.0 рдореЗрдВ рдЖрдзрд╛рд░ CsvHelperException рд╡рд╕реНрддреБ рдореЗрдВ рдЕрдм рд╕рднреА рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЧреБрдг рд╣реИрдВред рдХреЙрд▓рдмреИрдХ CsvHelperException рдмрдЬрд╛рдп Exception ред 3.0 рдмреАрдЯрд╛ NuGet рдкрд░ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

malinru picture malinru  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

JoshClose picture JoshClose  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Wagimo picture Wagimo  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

marcselman picture marcselman  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

RifS picture RifS  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ