Я пишу утилиту импорта данных для импорта данных в приложение базы данных.Данные могут быть извлечены из буфера обмена (например, из Excel) или файла и первоначально хранятся в списке TStringlist.На следующем шаге пользователь может выбрать соответствующий разделитель столбцов (табуляция, запятая и т. Д.).После разбиения данных на столбцы (с использованием выбранного разделителя) каждое строковое значение (назовем его значением ячейки) проверяется на соответствие действительному типу поля базы данных.
Проблема, с которой я столкнулся, связана с датой и временемзначения (и, возможно, значение даты и / или времени, но я еще не проверял это).Если пользователь выбирает «неправильный» разделитель, данные не разделяются, и каждая строка содержит один столбец (что, конечно, правильно).В таком случае значение ячейки может содержать строку, подобную приведенной ниже (я показываю значение отладки для отображения правильного разделителя, в данном случае вкладка):
'04 / 01/10 00:00'# 9'2.50' # 9'100 '# 9'Text value'
При использовании TryStrToDateTime или StrToDatetime это строковое значение «проходит», поскольку строка «обрезается» (т.е. игнорирует завершающий текст и возвращаетправильное значение даты-времени от 01.04.10).Если затем я передам значение ячейки (исходную строку) в качестве варианта функции сравнения диапазонов, то, очевидно, произойдет сбой с EVariantTypeCastError.
Есть ли метод (или существующая функция Delphi RTL)) проверить, чтобы строковое значение содержало только действительную дату (время) (т. е. без завершающего текста)?Не удалось найти функцию (или параметр функции) с учетом этого, я также думал о проверке длины строки, но мое программное обеспечение используется на международном уровне, и поэтому формат даты и времени будет различным и, следовательно, может иметь различную длину.
PS: я добавил ниже пример кода здесь, поскольку я не мог добавить его к своим комментариям.
procedure TForm1.Button1Click(Sender: TObject);
var
lStrVal: string;
lIsDateTime: boolean;
lDateTimeVal: TDateTime;
begin
lStrVal := '01/01/2019 10:00' + chr(9) + '120.00' + chr(9) + 'Some text';
lIsDateTime := TryStrToDateTime(lStrVal, lDateTimeVal);
if lIsDateTime then
messageDlg('String value is a date/time! ' + #13#10 + 'String: ' + lStrVal + #13#10 + 'Date/time is: ' + DateTimeToStr(lDateTimeVal), mtInformation, [mbOK], 0)
else
messageDlg('String value cannot be converted to a date/time!', mtWarning, [mbOK], 0);
end;