我有一个包含文件名的线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
然而,我的代码确实是只打印的日期,而不是整个行。要补充的,它甚至不按字母顺序排序。如何调整它,让它做,因为我打算?
您可以使用
string.scan(/^([^_]*_(\d++)(.*))/).sort_by { |m,n,z| [n.to_i,z] }.collect{ |m,n,z| m}.join("\n")
正则表达式将提取所有行成三个元件阵列具有以下值:整行,日期字符串和日期后的字符串。然后,.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'
)。
正则表达式的详细信息
^
- 一行的开始([^_]*_(\d++)(.*))
- 第1组(m
):整条生产线满足下列模式:
[^_]*
- 零或大于_
其它更多字符
_
- 下划线
(\d++)
- 第2组(n
):1+位数,所有格匹配
(.*)
- 第3组(z
):行的其余部分。