CSVhelper любой способ игнорировать "=" присутствует в CSV - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть приложение, которое генерирует данные CSV. Это приложение «услужливо» включает исправление Excel с использованием = в качестве преамбулы к цитируемым 0-заполненным числам c данных, чтобы предотвратить использование интерпретатором Excel лидирующих 0.

Я хочу использовать CSVHelper чтобы прочитать эти записи. Однако при сопоставлении с числом CSVhelper сообщает об ошибке для этих значений с префиксом =.

Кроме поиска / замены, чтобы вытащить "=", есть ли способ заставить CSVhelper игнорировать старшие равные и успешно обрабатывать? Я вижу варианты включения = в письменный вывод, но не разрешать их при разборе.

Вот пример записи:

"XYZ INC","R1G202113","R2G",<b>="202113"</b>,"D-SRS PRO FLD SM/2",157.49,122.53,True,50,50,0.00,1,False,"N",4.00,6.00,8.00,6.00,""

Любая гепатит с этим ценится.

1 Ответ

0 голосов
/ 19 февраля 2020

Это предположение, и может быть гораздо лучший способ, но, возможно, вы могли бы сделать что-то подобное с вашим отображением:

public class MyData
{
    //map the raw input to this field as a string
    public string MappedIntField {get;set;}=null;


    // use an integer property not mapped to any column to shadow the string, and lazy-convert to an integer the first time you read it.
    public int ActualIntField 
    {
        get {
            if (MappingReady || string.IsNullOrEmpty(MappedIntField)) return _ActualIntField;

            //clean up the extra = character.
            if (MappedIntField[0] == '=') MappedIntField = MappedIntField.Substring(1);

            int result; 
            if (int.TryParse(MappedIntField, out result))
            {
                 _ActualIntField = result;
                 MappingReady = true;
                 return result;
            }
            return _ActualIntField;             
        }
        set {
            _ActualIntField = value;
            MappingReady = true;
        }
    }
    private int _AcutalIntField;
    // We don't want to re-parse the string on every read, so also flag when this work is done. You could also use a nullable int? to do this.
    private bool MappingReady = false;

}
...