Распознавание строк времени в рубине - PullRequest
0 голосов
/ 02 марта 2011

Это не большая проблема, на самом деле, это просто из любопытства.

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

file_out.write Time.now

Как простой способ запомнить точно, когда была сделана каждая запись.

Теперь вот что мне интересно: есть ли способ проверить, является ли строка, полученная из файла (например, "cur_line = file_in.gets"), отметкой времени?

Причина, по которой это не является проблемой, заключается в том, что мой текущий метод - это регулярное выражение:

if cur_line =~(/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)/)

И, кажется, отлично работает для моих нужд. (Из-за характера проекта и форматирования того, что я пишу, я знаю, что в файле не будет других строк, содержащих текст формата «{Day} {Month}», поэтому я перестаю там разбираться. Просто день или месяц будут недостаточными и приведут к ложным срабатываниям).

Существуют ли другие, возможно, более симпатичные способы проверки временных меток? Я не буду обязательно использовать что-то другое (особенно, если вы скажете: «Вы можете сделать X, но это приведет к значительному снижению производительности» (не то, чтобы сравнения в этом проекте были серьезной проблемой для производительности. Я предполагаю, что разница вероятно, будет незначительным)).

Это просто что-то, что показалось мне интересным, и я догадался, что в Ruby могут быть классные способы. :)

Ответы [ 2 ]

2 голосов
/ 02 марта 2011

Вы можете просто сделать Time.parse cur_line, который вернет текущую дату, если время не может быть проанализировано должным образом. Не обязательно идеал, но Time.parse довольно мощный:)

РЕДАКТИРОВАТЬ: Интересный способ сделать регулярное выражение: Перед тем как зациклить файл, объявите регулярное выражение следующим образом:

expression = Regexp.new("^(#{Time::RFC2822_DAY_NAME.join("|")}) (#{Time::RFC2822_MONTH_NAME.join("|")})")

Затем, когда вы перебираете каждую строку, выполните: cur_line.match(expression). Это вернет nil, если нет совпадения. Интересный (хотя и более длинный) способ сделать это.

1 голос
/ 02 марта 2011

Вы можете попытаться пропустить строки через хронический или Date.parse , но я бы поспорил, что оба эти метода менее эффективны, чем использование регулярного выражения. Влияние этой эффективности полностью зависит от того, сколько текста вам нужно проанализировать.

...