Как пропустить плохие записи - PullRequest
3 голосов
/ 15 января 2012

Я использую File Helpers 2.9.9 , и мне интересно, как я могу пропустить плохие записи вместо того, чтобы просто рухнуть?

object[] transactions = engine.ReadStream(textReader); // will crash if one record fails.

У меня также возникают проблемы с DateTime. Я не могу понять, почему он не может конвертировать «22.12.2011» с использованием форматов, которые я установил.

Error Converting '"12/22/2011"' to type: 'DateTime'.  does not match any of the given formats: 'MM/dd/yyyy', 'MM/d/yyyy', 'M/d/yyyy'
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: FileHelpers.ConvertException: Error Converting '"12/22/2011"' to type: 'DateTime'.  does not match any of the given formats: 'MM/dd/yyyy', 'MM/d/yyyy', 'M/d/yyyy'

Ответы [ 2 ]

4 голосов
/ 15 января 2012

1) [EDIT] - я ошибся, вы можете установить engine.ErrorManager.ErrorMode в SaveAndContinue - см. Примеры @ http://www.filehelpers.com/example_errorhandling.html

2) на основе одинарных кавычексодержащий строку с двойными кавычками, я бы сказал, что проблема в том, что вам нужно предоставить атрибут FieldQuoted - см. http://www.filehelpers.com/attributes.html

3 голосов
/ 16 января 2012

Вы можете использовать событие BeforeReadRecord для анализа строки записи и установить skipThisRecord = True для любых записей, которые нужно пропустить. Например:

FileHelperEngine engine = new FileHelperEngine(typeof(Orders)); 
// set the event here
engine.BeforeReadRecord += new BeforeReadRecordHandler(BeforeEvent); 

Тогда само событие:

private void BeforeEvent(EngineBase engine, BeforeReadRecordEventArgs e)
{
    // skip any bad lines
    if (e.RecordLine.StartsWith(" ") || e.RecordLine.StartsWith("-"))
        e.SkipThisRecord = true;
}

В приведенном выше примере любая запись, которая начинается с пробела или «-», будет пропущена, но вы можете применить любую логику, которая вам нужна. Вы можете использовать e.RecordLine.Split(','), чтобы разбить текущую строку на массив значений столбцов, а затем использовать DateTime.TryParse(), чтобы определить, является ли строка даты действительной.

...