C # filehelpers CSV DateTime исключение в другой системе - PullRequest
0 голосов
/ 07 июня 2019

Итак, я заставил свою программу делать то, что я хочу, но она не работает на моем рабочем ПК (Win 7).

  • При использовании скомпилированной версии с домашнего компьютера (Win 10) на рабочем компьютере я получить ошибку "последовательность не имеет элементов" со всеми методами моего программа при попытке прочитать файл с помощью filehelpers engine.
  • Когда я использую тот же sln из дома, который скомпилирован с рабочего компьютера на моем домашнем компьютере, он работает.
  • Когда я собираю ту же программу на моем рабочем ПК, я получаю другая ошибка:
FileHelpers.ConvertException: „Error Converting '03/19/2019 3:40 PM' to type: 'DateTime'.  Using the format: 'MM/dd/yyyy h:mm tt'”

, что очень странно, потому что программа работает на моем домашнем компьютере.

шаблон данных:

[DelimitedRecord(","), IgnoreFirst(1)]
public class CSVDataFields
{
    [FieldQuoted('"')] [FieldConverter(ConverterKind.Date, "MM/dd/yyyy h:mm tt")]
    public DateTime Date;

    [FieldQuoted('"')]
    public float Value;
}

и данные, которые читает программа:

"Date","Value"
"03/19/2019 3:40 PM","23.1"

Я «переписал» (создаю новый проект и скопировал методы вставки по одному) программу на моем рабочем компьютере, но это ничего не изменило.

Понятия не имею, что может вызвать эту проблему, только различия в языке системы и операционной системе.

1 Ответ

0 голосов
/ 06 июля 2019

Класс DateTimeConvertor, который находится в Converters/ConvertHelpers.cs, имеет несколько конструкторов, которые могут быть инициированы только с помощью формата или с использованием культуры. Если вы включаете культуру, то культура получается через

if (culture != null)
    mCulture = CultureInfo.GetCultureInfo(culture);

При попытке преобразования в методе StringToField() используется функция DateTime.TryParseExact ().

DateTime.TryParseExact(from.Trim(), mFormat, mCulture, DateTimeStyles.None, out val)

Если переменная mCulture не была установлена ​​выше, то текущая культура используется, как было сказано ранее @niisK.

Документация Microsoft по этому вопросу в https://docs.microsoft.com/en-us/dotnet/api/system.datetime.tryparseexact?view=netframework-4.8 состояние:

Конкретные символы и строки даты и времени (например, названия дней недели на определенном языке), используемые в s, определяются параметром провайдера, как и точный формат s, если формат является стандартным форматом. строка спецификатора. Параметр провайдера может быть любым из следующих:

  • Объект CultureInfo, представляющий культуру, используемую для интерпретации s. Объект DateTimeFormatInfo, возвращаемый свойством DateTimeFormat, определяет символы и форматирование в s.

  • Объект DateTimeFormatInfo, определяющий формат данных даты и времени.

  • Пользовательская реализация IFormatProvider, метод GetFormat которой возвращает либо объект CultureInfo, либо объект DateTimeFormatInfo, предоставляющий информацию о форматировании.

Если поставщик имеет значение NULL, используется объект CultureInfo, соответствующий текущей культуре.

Итак, ошибки, с которыми вы столкнулись, могли быть связаны с конфликтом между форматом, который вы пытались использовать, и культурой, которая используется по умолчанию. Настройка культуры, как вы это сделали, скорее всего «исправит» проблему, но вы должны проверить, какая культура используется в следующий раз, поскольку она, вероятно, неверна в настройках панели управления / системы.

...