Как пропустить плохие записи

Я использую 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'

person chobo2    schedule 15.01.2012    source источник
comment
Не могли бы вы рассказать нам, какой API вы используете для этого? Есть ли причина, по которой вы не можете просто обернуть вызов в try/catch?   -  person JaredPar    schedule 15.01.2012
comment
Мне кажется, что он пытается выполнить весь поток, и если все записи не могут пройти, он терпит неудачу.   -  person chobo2    schedule 15.01.2012
comment
В связи с этим, если кто-нибудь знает, как я могу связаться с Маркосом, я был бы очень признателен, поскольку мои попытки отправить исправления до сих пор не получили никакого ответа :(   -  person James Manning    schedule 15.01.2012
comment
@MarcosMeli ответил на мой пост (stackoverflow.com/questions/8828132/ field-order-in-filehelpers), поэтому, возможно, вы сможете получить его через стек (stackoverflow.com/users/203579 /маркосмели)   -  person chobo2    schedule 15.01.2012


Ответы (2)


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

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

person James Manning    schedule 15.01.2012
comment
Можешь скинуть ссылку на свой патч? - person M.Babcock; 15.01.2012
comment
@James Manning - Я бы тоже хотел увидеть этот патч. Есть ли способы узнать, какая строка не удалась? Я беру документ, загруженный пользователем, если он не работает, было бы неплохо сообщить им, где он потерпел неудачу, а не только весь документ. - person chobo2; 15.01.2012
comment
@ M.Babcock - я ошибался, в движке он уже есть, см. filehelpers.com/example_errorhandling.html< /а> - person James Manning; 16.01.2012
comment
@chobo2 - я ошибался, в движке это уже есть, см. filehelpers.com/example_errorhandling.html - person James Manning; 16.01.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(), чтобы определить, действительна ли строка даты.

person shamp00    schedule 16.01.2012