Как напечатать каждую строку, содержащую шаблон регулярного выражения, и отсортировать их по алфавиту? - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть файл test_list.txt, содержащий строки с именами файлов.Каждое имя файла содержит дату, когда они были созданы.Вот как это выглядит:

test_list.txt:

UTF_06012018_SAMPLE_Control.xlsx
UTF_06022018_SAMPLE_Control.xlsx
UTF_06092018_SAMPLE_Control.xlsx
UTF_06022018_SAMPLE_Control.xlsx
UTF_06082018_SAMPLE_Control.xlsx  
UTF_06032018_SAMPLE_Demand.xlsx               
UTF_06092018_SAMPLE_Demand.xlsx  
UTF_06122018_SAMPLE_Demand.xlsx
UTF_06032018_SAMPLE_Control.xlsx
UTF_06022018_SAMPLE_Demand.xlsx

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

Вот мой код:

path = Dir.glob('/path/to/my/file/*.txt').first
regex = /(\d{1,2}\d{1,2}\d{4})/

samplefile = File.open(path)
string = File.read(samplefile)

string.scan(regex).each do|x|
    sorted = x.sort_by { |s| s.scan(/\d+/).first.to_i }
 puts sorted
end

Однако,Мой код печатает только даты, а не всю строку.Чтобы добавить к этому, он даже не сортирует их по алфавиту.Как настроить его и сделать так, как я собираюсь?

1 Ответ

0 голосов
/ 06 февраля 2019

Вы можете использовать

string.scan(/^([^_]*_(\d++)(.*))/).sort_by { |m,n,z| [n.to_i,z] }.collect{ |m,n,z| m}.join("\n")

См. Демонстрационную версию Ruby .

Регулярное выражение извлечет все строки в массив из трех элементов со следующими значениями: вся строка, строка даты и строка после даты.Затем .sort_by { |m,n,z| [n.to_i,z] } отсортирует сначала по строке даты, а затем по подстроке после даты..collect{ |m,n,z| m} сохранит только первое значение элементов массива, а .join("\n") перестроит результирующую строку.

Обратите внимание, что вместо [n.to_i,z] вы можете сначала проанализировать строку даты,затем используйте [Date.strptime(n,"%d%m%Y"),z] (добавьте require 'date').

Regex детали

  • ^ - начало строки
  • ([^_]*_(\d++)(.*)) - группа 1 (m): вся строка соответствует следующим образцам:
    • [^_]* - ноль или более символов, отличных от _
    • _ - подчеркивание
    • (\d++) - Группа 2 (n): 1+ цифры, притяжательное совпадение
    • (.*) - Группа 3 (z): остальная часть строки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...