:: Visual Foxpro, Foxpro for DOS
20 декабря 2024 года -> {20.12.2024}
Равиль
Автор

Сообщений: 6692
Откуда: Уфа
Дата регистрации: 01.08.2003
Привет !

Нужна функция преобразования такой строки в дату
Ни у кого не завалялась ?

ps Сейчас накидаю свой вариант ...


------------------
Тяжело согнать курсором муху с монитора ...




Исправлено 1 раз(а). Последнее : Равиль, 20.12.24 09:44
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
ssa

Сообщений: 13085
Откуда: Москва
Дата регистрации: 23.03.2005
Равиль
Привет !
Нужна функция преобразования такой строки в дату
Точно нужна?
Цитата:
Ни у кого не завалялась ?
Не-а...
Цитата:

ps Сейчас накидаю свой вариант ...
aa = '{20.12.2024}'
?Evaluate(aa)


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
Равиль
Автор

Сообщений: 6692
Откуда: Уфа
Дата регистрации: 01.08.2003
Сергей, привет - ну не то нужно ...

на входе строки типа : "20 декабря 2024 года", "20.12.2024г." и т.п.
на выходе дата : {20.12.2024}

Оговорюсь, что строки будут традиционные в документах


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
chunihin-df

Сообщений: 88
Откуда: Тюмень
Дата регистрации: 18.11.2013
Ничего проще придумать не удалось.




Исправлено 3 раз(а). Последнее : chunihin-df, 20.12.24 12:10
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
Равиль
Автор

Сообщений: 6692
Откуда: Уфа
Дата регистрации: 01.08.2003
Дмитрий, приветствую !

Спасибо .. проверка на "20 декабря 2024 года" отработала

Но я пошел дальше
и потестил Вашу функцию на других строках (привожу и свой вариант для сравнения) :

Clear
*!* Set Step On
? "chunihin-df :"
? Str2Date_chunihin_df("20 декабря 2024 года")
? Str2Date_chunihin_df("20.12.2024")
? Str2Date_chunihin_df("20/12.2024г.")
? Str2Date_chunihin_df("20 дек 2024г.")
? Str2Date_chunihin_df("20 декабря")
? Str2Date_chunihin_df("20-12 2024 года")
? Str2Date_chunihin_df("20.12.24 г.")
? "Равиль :"
? str2date_Ravil("20 декабря 2024 года")
? str2date_Ravil("20.12.2024.")
? str2date_Ravil("20/12.2024г.")
? str2date_Ravil("20 дек 2024г.")
? str2date_Ravil("20 декабря")
? str2date_Ravil("20-12 2024 года")
? str2date_Ravil("20.12.24 г.")
*****************************************
Function Str2Date_chunihin_df && Дмитрий
LPARAMETERS tcDateLongRu
LOCAL lcDSTR, laDateParts(1)
m.lcDSTR = ALLTRIM(EVL(NVL(m.tcDateLongRu,""),""))
IF NOT BETWEEN(ALINES(m.laDateParts, m.lcDSTR, 1+4, " "), 3, 4)
RETURN {..}
ENDIF
LOCAL lSaveDate, lSaveCentury
m.lSaveDate = SET("Date")
m.lSaveCentury = SET("Century")
SET DATE GERMAN
SET CENTURY ON
LOCAL ldDate
m.ldDate = {..}
TRY
LOCAL lcDate
m.lcDate = m.laDateParts[1] + ;
"." +;
PADL(TRANSFORM(INT((ATC(','+LEFT(STRTRAN(m.laDateParts[2],"май","мая",1,1,1), 3)+',', ",янв,фев,мар,апр,мая,июн,июл,авг,сен,окт,ноя,дек,") + 3) / 4)),2, "0") + ;
"." +;
m.laDateParts[3]
m.ldDate = CTOD(m.lcDate)
FINALLY
SET DATE &lSaveDate
SET CENTURY &lSaveCentury
ENDTRY
RETURN m.ldDate
*********************************************************
Function Str2Date_Ravil && 20.12.2024 11:39 - Мой вариант
Lparameters tcDate
If Empty(m.tcDate)
Return {}
Endif
tcDate = Upper(Alltrim(Chrtran(tcDate, ["./-], [ ]))) && заменяю разделители на пробелы
If !Isdigit(m.tcDate) && если первый символ не числовой, то и разбирать не хочется со стоками типа "Дуатсатова ... "))
Return {}
Endif
Local ln, lnWords, lnDay, lnMonth, lnYear, ldDate
Local Array laWords[3]
Store 0 To lnDay, lnMonth, lnYear
lnWords = Min(3, Getwordcount(m.tcDate)) && беру максимум 3 слова
For ln = 1 To m.lnWords
laWords[m.ln] = Getwordnum(m.tcDate, m.ln)
Next
If Empty(laWords[3])
lnYear = Year(Date())
Else
lnYear = Val(laWords[3])
Do Case
Case Between(m.lnYear, 0, 49)
lnYear = 2000 + m.lnYear
Case Between(m.lnYear, 50, 99)
lnYear = 1900 + m.lnYear
Endcase
Endif
If Isdigit(laWords[2])
lnMonth = Val(laWords[2])
If m.lnMonth > 12
lnMonth = 0
Endif
Else
Do Case
Case laWords[2] = "ЯНВ"
lnMonth = 1
Case laWords[2] = "ФЕВ"
lnMonth = 2
Case laWords[2] = "МАР"
lnMonth = 3
Case laWords[2] = "АПР"
lnMonth = 4
Case laWords[2] = "МА"
lnMonth = 5
Case laWords[2] = "ИЮН"
lnMonth = 6
Case laWords[2] = "ИЮЛ"
lnMonth = 7
Case laWords[2] = "АВГ"
lnMonth = 8
Case laWords[2] = "СЕН"
lnMonth = 9
Case laWords[2] = "ОКТ"
lnMonth = 10
Case laWords[2] = "НОЯ"
lnMonth = 11
Case laWords[2] = "ДЕК"
lnMonth = 12
Otherwise
lnMonth = 0
Endcase
Endif
lnDay = Val(laWords[1])
If m.lnDay > 31
lnDay = 0
Endif
If Inlist(0, m.lnDay, m.lnMonth, m.lnYear)
ldDate = {}
Endif
Try &&
ldDate = Date(m.lnYear, m.lnMonth, m.lnDay)
Catch
ldDate = {}
Endtry
Return m.ldDate


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
chunihin-df

Сообщений: 88
Откуда: Тюмень
Дата регистрации: 18.11.2013
Ладно, все равно первый вариант был так себе, set strictdate не проверялся даже

Но к счастью уже вышла вторая версия
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
Равиль
Автор

Сообщений: 6692
Откуда: Уфа
Дата регистрации: 01.08.2003
Ваш код компактный.
Но пока не ест другие варианты строк
Мой тоже можно сократить - некоторые вещи пишу по старинке.

Зачем мне это нужно - из Excel загружаю всякие счета и накладные
Табличные части - без проблем.
Решил и шапки грузить - вот вопрос и возник с датами.



------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
chunihin-df

Сообщений: 88
Откуда: Тюмень
Дата регистрации: 18.11.2013
Компактный? Ну не знаю, чувствую , что когда сюда приедет akvvohinc, мы все получим на орехи
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
Равиль
Автор

Сообщений: 6692
Откуда: Уфа
Дата регистрации: 01.08.2003
chunihin-df
Компактный? Ну не знаю, чувствую , что когда сюда приедет akvvohinc, мы все получим на орехи

... и правильно сделает

Главное сделать работящий код, потом можно взять напильник ...


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
ssa

Сообщений: 13085
Откуда: Москва
Дата регистрации: 23.03.2005
Равиль
Сергей, привет - ну не то нужно ...
на входе строки типа : "20 декабря 2024 года", "20.12.2024г." и т.п.
на выходе дата : {20.12.2024}

Оговорюсь, что строки будут традиционные в документах
Ну так, батенька, задачи надо правильно формулировать!

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
ssa

Сообщений: 13085
Откуда: Москва
Дата регистрации: 23.03.2005
Равиль
Зачем мне это нужно - из Excel загружаю всякие счета и накладные
Табличные части - без проблем.
Решил и шапки грузить - вот вопрос и возник с датами.
И потому первый вопрос, на который надо получить ответ: в каком формате там хранятся даты. Ибо, как известно, хранение и отображение - две большие разницы.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
Равиль
Автор

Сообщений: 6692
Откуда: Уфа
Дата регистрации: 01.08.2003
ssa
Равиль
Зачем мне это нужно - из Excel загружаю всякие счета и накладные
Табличные части - без проблем.
Решил и шапки грузить - вот вопрос и возник с датами.
И потому первый вопрос, на который надо получить ответ: в каком формате там хранятся даты. Ибо, как известно, хранение и отображение - две большие разницы.

в файлах Excel от разных поставщиков в самых разных форматах,
их вынимаю транформируя в строку TRANSFORM() - с этим проблем нет


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
ssa

Сообщений: 13085
Откуда: Москва
Дата регистрации: 23.03.2005
Равиль
ssa
Равиль
Зачем мне это нужно - из Excel загружаю всякие счета и накладные
Табличные части - без проблем.
Решил и шапки грузить - вот вопрос и возник с датами.
И потому первый вопрос, на который надо получить ответ: в каком формате там хранятся даты. Ибо, как известно, хранение и отображение - две большие разницы.

в файлах Excel от разных поставщиков в самых разных форматах,
их вынимаю транформируя в строку TRANSFORM() - с этим проблем нет
То есть специально усложняешь условия задачи? А потом ищешь универсальную функцию для преобразования самого неудобного формата в дату?

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
Равиль
Автор

Сообщений: 6692
Откуда: Уфа
Дата регистрации: 01.08.2003
ssa
..То есть специально усложняешь условия задачи? А потом ищешь универсальную функцию для преобразования самого неудобного формата в дату?
Сергей, мы о разных вещах.
Ты похоже имеешь ввиду извлечение даты из ячейки, где она хранится в виде числа дней от 1 янв 1900 года.
Я говорю о ячейках, которые изначально заполнены текстом типа "Счет № 123 от 20 декабря 2024г."


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
chunihin-df

Сообщений: 88
Откуда: Тюмень
Дата регистрации: 18.11.2013
Такое лучше регулярными выражениями разбирать
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
ssa

Сообщений: 13085
Откуда: Москва
Дата регистрации: 23.03.2005
Равиль
ssa
..То есть специально усложняешь условия задачи? А потом ищешь универсальную функцию для преобразования самого неудобного формата в дату?
Сергей, мы о разных вещах.
Ты похоже имеешь ввиду извлечение даты из ячейки, где она хранится в виде числа дней от 1 янв 1900 года.
Угу.
Цитата:
Я говорю о ячейках, которые изначально заполнены текстом типа "Счет № 123 от 20 декабря 2024г."
И каким боком тут Transform()?

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
Равиль
Автор

Сообщений: 6692
Откуда: Уфа
Дата регистрации: 01.08.2003
ssa
Равиль
...
Я говорю о ячейках, которые изначально заполнены текстом типа "Счет № 123 от 20 декабря 2024г."
И каким боком тут Transform()?
Тут - никаким - ты прав как всегда

Вопрос для меня был решен уже в третьем сообщении.
Функция, предназначенная для облегчения работы менеджера
позволяет выудить нужные данные из строки.
Спасибо )


------------------
Тяжело согнать курсором муху с монитора ...




Исправлено 1 раз(а). Последнее : Равиль, 20.12.24 18:36
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
akvvohinc

Сообщений: 4560
Откуда: Москва
Дата регистрации: 11.11.2008
Равиль
Вопрос для меня был решен уже в третьем сообщении.
"Компактность" решения во многом зависит от требований к исходной "строке-дате".
Во всех приведенных примерах между компонентами даты имеются разделители.
Но я бы добавил в перечень допустимых и такие, достаточно часто встречающиеся, варианты:
12дек2024
12дек 24
12 декабря1998

Да, и вариант Равиля будет здесь валиться, если в исходных данных количество слов окажется меньше 2 (2-й элемент останется = .F.):
If Isdigit(laWords[2])



Исправлено 1 раз(а). Последнее : akvvohinc, 20.12.24 19:46
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
of63

Сообщений: 26001
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
() Прорекламирую хотя бы название ф-ии - VALTOTIP(значение, тип), я такую написал уже давно, без нее неудобно среди вариантов представления )))

Доб. Это просто разборщик значения в параметре (1), и приводящий его к типу, обозначенному одной буквой (2C).

() Это все из парадигмы - прячьте (оформляйте) все свои явные хотелки в виде функции. для этого языки программирования и созданы - чтобы делать субмодули, "среды", набор готовых подпрограмм на моем языке.

Не поленился, и попытался показать эту ф-ию преобразования всего во всё



Исправлено 2 раз(а). Последнее : of63, 20.12.24 23:23
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
akvvohinc

Сообщений: 4560
Откуда: Москва
Дата регистрации: 11.11.2008
Олег, ты уже не первый раз выкладываешь эту функцию, и каждый раз тебе говорят, что она сама по себе не работает, так как в ней используются внешние переменные.
Вряд ли кто-то станет изучать совсем не маленький код, прежде чем попробует, насколько она подходит для его нужд.
Но вот попробовать-то как раз и нельзя.

Но раз ты её рекламируешь как универсальную (преобразование всего во всё), то почему бы сначала не сделать её "самодостаточной" - не зависящей от "внешней среды"?
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 20 Burn  (Гостей: 19)

© 2000-2025 Fox Club 
Яндекс.Метрика