|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
Здравствуйте! Столкнулся с такой проблемой в базе есть строка которая отображает год, записана в разных форматах: 06,,07/16 ,06/16,07/16 07/16 08 ,06/16,07/16 07/16,07/16 05,07/16 Какой алгоритм можно придумать, чтобы вытягивать месяц, год и вставлять в new DateTime(2016, 7, 1); ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2016, 11:50 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
son456, если нет ни какой логики(алгоритма) по которому вкрячивались эти данные, то - руками... и привет индусам... если таки каждая строка с "датой" в формате - [mm[,mm]/]yy,... то еще можно побороться... так что на счет формата? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2016, 11:58 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
Во что это должно превратиться? son45605,07/16 А это? son45606,,07/16 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2016, 13:01 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
Создал программку: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32.
Результат ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2016, 14:30 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
05,07/16 должно превратится в две даты 05/16 и 07/16 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2016, 14:32 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
06,,07/16 две запятые это ошибки ввода должно превратиться в 06/16 и 07/16 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2016, 14:33 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
Как вариант: читаешь последовательно с разделителем ',' или '/' если прочитано не ноль, то вставляешь в очередь. если разделитель / то читаешь после него год, извлекаешь из очереди месяца и генеришь даты. Например для "06,,07/16" 1. прочитал 06 - в очередь 2. прочитал "" - игнорируем 3. прочитал 07 - в очередь 4. прочитал год 16 из очереди извлекаем месяцы, получаем 06/16 и 07/16 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2016, 14:51 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
Если не сложно можете привести пример кода, дело в том что я так примерно и представляю, я закодировать это не могу ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2016, 15:10 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
son45605,07/16 должно превратится в две даты 05/16 и 07/16 На здоровье: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Подаёшь на вход строку, получаешь коллекцию дат, возможно пустую, если в строке ничего не нашлось. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2016, 15:35 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
son456, А вот и тесты: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
Тесты нашли косяк, вот исправленный метод, можно пользоваться: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2016, 15:45 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
Спасибо, все работает! ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2016, 16:42 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
Я так понимаю это Код: c# 1. 2.
надо рассматривать как Код: c# 1.
если я прав, то тут просто совпадение, т.к. даты из текущего года hVostt Код: c# 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2016, 17:07 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
Dima Tесли я прав, то тут просто совпадение, т.к. даты из текущего года Это было бы по меньшей мере странно. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2016, 19:11 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
hVosttЭто было бы по меньшей мере странно. ИМХУ странно подразумевать что если в каком-то наборе не указан год, то считаем что год текущий. А если набор прошлогодний? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2016, 19:36 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
Dima TИМХУ странно подразумевать что если в каком-то наборе не указан год, то считаем что год текущий. А если набор прошлогодний? Если года нет, значит считается, что текущий. Потому что в строке может быть несколько дат с разными годами и алгоритм выяснения года по какому-то другому более полному значению выглядит очень нелепо. А текущий год как дефолтовый выглядит куда ни шло. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2016, 21:04 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
hVosttЕсли года нет, значит считается, что текущий. Тогда уж считать что строка заполнена некорректно. Считать умолчанием меняющееся значение это грабли какие-то. Сегодня получаем 08.16 через месяц тоже самое даст 08.17 Смысла гадать нет. Пусть ТС напишет как правильно трактовать эту строчку. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2016, 07:27 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
son456Если не сложно можете привести пример кода, дело в том что я так примерно и представляю, я закодировать это не могу как-то так Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2016, 08:29 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
Мусор на входе - мусор на выходе Ничего нового ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2016, 08:55 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
Dima TТогда уж считать что строка заполнена некорректно. Я бы с самого начала такие "форматы" не принял в разработку. Dima TСчитать умолчанием меняющееся значение это грабли какие-то. Сегодня получаем 08.16 через месяц тоже самое даст 08.17 Если года нет, откуда его взять тогда? А если в строке два разных года попалось, какой взять? Текущий год есть всегда. Учитывая постановку задачи, более менее вменяемое решение, которое по крайне мере работает всегда -- это брать текущий год. К слову, код который я привёл очень простой и очень понятный, без переподвыподвертов. Исправить его сможет даже птушница. К сожалению о твоём коде этого не скажешь. Без поллитра не подлезешь. Слишком замудрёный и сложный без видимого профита. Решать задачу надо как можно проще. Самые простые, короткие и понятные решения оказываются чаще всего наиболее эффективными и правильными. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2016, 09:01 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
ИзопропилМусор на входе - мусор на выходе Ничего нового Да тут решать надо проблему уровнем выше. По голове кому-нибудь настучать и пару бездельников без извилины в голове уволить. Больше пользы будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2016, 09:03 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
hVosttЕсли года нет, откуда его взять тогда? А если в строке два разных года попалось, какой взять? Ниоткуда. Исключение выдать и разбираться откуда бардак в исходных данных появился. Ты же месяц не проверяешь, если написать 55 то будет исключение, зачем тогда Код: c# 1.
Ставь 0, тоже будет исключение. hVosttК слову, код который я привёл очень простой и очень понятный, без переподвыподвертов. Исправить его сможет даже птушница. Наверно я до уровня птушницы еще не дорос, регулярки не освоил еще hVosttК сожалению о твоём коде этого не скажешь. Без поллитра не подлезешь. Слишком замудрёный и сложный без видимого профита. Примитивный посимвольный парсер с конечным автоматом в стиле С с классами. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2016, 09:25 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
Dima TНиоткуда. Исключение выдать и разбираться откуда бардак в исходных данных появился. Наилучшим решением было бы строгий формат даты, например dd/MM/yy. Но раз года нет, а ТС сказал, что год надо подставить, значит его надо где-то взять. Твоё решение взять год из какой-то другой даты наобум всё же хуже, чем взять однозначно текущий год и точка. Dima TТы же месяц не проверяешь, если написать 55 то будет исключение, зачем тогда Зачем мне проверять месяц, если это прекрасно делает new DateTime? Что даст эта дополнительная проверка, если исключение в любом случае будет? Dima TПримитивный посимвольный парсер с конечным автоматом в стиле С с классами. Абсолютно бессмысленное и беспощадное решение. Во многих адекватных компаниях за такое бьют по рукам. Другое дело, если вот этот участок кода задетектился, как бутылочное горлышко, и то, сильно сомневаюсь, что конечный автомат тут сильно бы помог. В общем ИМХО. Такой код писать нельзя. И тем более нельзя давать его новичкам, а ТС по определению новичек, зачем ему мозг выносить? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2016, 10:29 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
Dima TНаверно я до уровня птушницы еще не дорос, регулярки не освоил еще Я к тому, что понятный сопровождаемый код лучше для всех, в том числе для команды и компании в целом. Посимвольные парсеры может и интересная задачка, но профита кроме разминки ума в целом -- никакого. Только вред в чистом виде. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2016, 10:35 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
Dima TПримитивный посимвольный парсер с конечным автоматом в стиле С с классами. регулярные выражения для того и придуманы чтоб не кодировать врукопашную конечные автомаьы ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2016, 13:41 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
hVosttПосимвольные парсеры может и интересная задачка, но профита кроме разминки ума в целом -- никакого. скорее область применения узкая ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2016, 13:42 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
ИзопропилDima TПримитивный посимвольный парсер с конечным автоматом в стиле С с классами. регулярные выражения для того и придуманы чтоб не кодировать врукопашную конечные автомаьы Знаю, надо как-то собраться и поизучать регулярку. hVosttЯ к тому, что понятный сопровождаемый код лучше для всех, в том числе для команды и компании в целом. Посимвольные парсеры может и интересная задачка, но профита кроме разминки ума в целом -- никакого. Только вред в чистом виде. Я сначала думал написать почисловой парсер: число, разделитель, число, разделитель ... но букав много получилось, а посимвольный в данном случае самое то что надо. Профит тут в производительности, он очень ощутим когда за нее из своего кармана платишь (мой случай). Можно купить за свой счет железяку помощнее, а можно обойтись оптимизацией кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2016, 18:28 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
Dima TПрофит тут в производительности, он очень ощутим когда за нее из своего кармана платишь (мой случай). Можно купить за свой счет железяку помощнее, а можно обойтись оптимизацией кода. Не могу согласиться. Здесь даже мало-мальски ощутимого профита не получишь. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2016, 20:16 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
hVosttDima TПрофит тут в производительности, он очень ощутим когда за нее из своего кармана платишь (мой случай). Можно купить за свой счет железяку помощнее, а можно обойтись оптимизацией кода. Не могу согласиться. Здесь даже мало-мальски ощутимого профита не получишь. new MyObject() это очень дорого по сравнению с вычислениями с int. В разы. Если бы в данной задаче входные данные занимали бы гигабайт, то было бы заметно. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2016, 20:38 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
Dima TЕсли бы в данной задаче входные данные занимали бы гигабайт, то было бы заметно. Мне интересно, на скольких данных ты выгадаешь хотя бы секунду времени ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2016, 23:11 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
Dima Tnew MyObject() это очень дорого по сравнению с вычислениями с int Вот это кстати не понял, ты про создание объекта регекспа? Его легко можно вынести в статическое поле, кроме того, он компилируется в сборку. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2016, 00:03 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
Кажется правильным делать сначала самое простое, очевидное и читаемое решение. Потом уже по необходимости - рефакторинг, если потребуется выигрывать миллисекунды. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2016, 05:43 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
hVosttМне интересно, на скольких данных ты выгадаешь хотя бы секунду времени Кстати, как-то раз в похожей ситуации было не лень, и был сделан сравнительный тест. Вариант с регулярками, как ни странно, оказался быстрее. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2016, 06:14 |
|
Не могу вытянуть дату из строки
|
|||
---|---|---|---|
#18+
hVosttВот это кстати не понял, ты про создание объекта регекспа? Его легко можно вынести в статическое поле, кроме того, он компилируется в сборку. Его можно однократно создать, я от том что он создает: m.Groups это куча строк. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2016, 07:04 |
|
|
start [/forum/topic.php?all=1&fid=20&tid=1400166]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
48ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 163ms |
0 / 0 |