我有一个如下所示的文本文件:
testdatabase-21-07-15-12-00
testdatabase-21-07-15-18-00
testdatabase-21-07-15-23-00
testdatabase-22-07-15-12-00
testdatabase-22-07-15-18-00
testdatabase-22-07-15-23-00
and many more like this (dynamically generated)
我正在将 (21/22-07-15) 与另一个文本文件进行比较,如果找到匹配项,我需要查看哪个是最新的。例如,如果找到日期 21-07-15 的匹配项,我需要从 21 的众多匹配项中检索最新的(即 23)。与 22 的情况相同,...如果找到匹配项。
到目前为止我所做的是:
$temp = Get-Content "C:\RDS\temp.txt"
foreach($te in $temp)
{
$t = $te -split '-'
$da = $t[1]
$mo = $t[2]
$yea = $t[3]
if("$da-$mo-$yea" -match $temp1)
{
# need to write the concept here
}else
{
#nothing
}
}
我该如何完成这个任务?任何帮助我都会非常感激。
答案1
我认为您需要新的方法。如果将您的文件解析为哈希表,那么您将能够按日期接收最后日期+时间。
# I use string variable for debugging
$temp = "testdatabase-21-07-15-12-00
testdatabase-21-07-15-18-00
testdatabase-21-07-15-19-00
testdatabase-21-07-15-20-00
testdatabase-21-07-15-21-00
testdatabase-21-07-15-23-00
testdatabase-22-07-15-12-00
testdatabase-22-07-15-13-00
testdatabase-22-07-15-14-00
testdatabase-22-07-15-15-00
testdatabase-22-07-15-18-00
testdatabase-22-07-15-23-00" -split "`r`n"
# parse $temp to hashtable by date
$hash = @{}
foreach ($te in $temp) {
if ($te -match "testdatabase-(\d\d-\d\d-\d\d)") {
[Array]$hash[$Matches[1]] += $te
}
}
现在$hash
看起来像:
Name Value
---- -----
21-07-15 testdatabase-21-07-15-12-00
testdatabase-21-07-15-18-00
testdatabase-21-07-15-19-00
testdatabase-21-07-15-20-00
testdatabase-21-07-15-21-00
testdatabase-21-07-15-23-00
22-07-15 testdatabase-22-07-15-12-00
testdatabase-22-07-15-13-00
testdatabase-22-07-15-14-00
testdatabase-22-07-15-15-00
testdatabase-22-07-15-18-00
testdatabase-22-07-15-23-00
经过这些操作后,您可以通过键访问数组<day>-<month>-<year>
并从中获取最新元素:
$temp1 = "21-07-15"
if ($hash.ContainsKey($temp1)) {
$array = $hash[$temp1]
# last element in array
$last = $array[$array.Length - 1]
Write-Host $last -ForegroundColor Blue
}
输出:
testdatabase-21-07-15-23-00
答案2
我使用自定义对象来组织具有 3 个属性的列表:文件名、完整日期、仅日期。日期值被转换并存储为实际的 [datetime] 变量。有了那个真实的时间,您可以使用原生 powershell 分组和排序功能来获取每天的最新文件。
我位于美国,我的操作系统默认为 mm/dd/yy。如果您所在的地区有不同的默认值,您可能需要调整 $dateFull 和 $dateOnly 的 var 赋值右侧。
$crossref = @()
gc dates.txt | foreach {
($name, $day, $month, $year, $hour, $minute) = $_.split("-")
$dateFull = [datetime]"$month/$day/$year $hour`:$minute"
$dateOnly = [datetime]"$month/$day/$year"
$crossref += New-Object PSCustomObject -Property @{"fileName" = $_; "dateFull" = $dateFull; "dateOnly" = $dateOnly;}
}
# raw unsorted data from our new object
$crossref | ft -a
# most recent file for each day
$crossref | group-object dateOnly | foreach {$_.Group | Sort-Object dateFull | Select-Object -Last 1} | fl
PS C:\temp> .\fault.ps1
dateFull dateOnly fileName
-------- -------- --------
7/21/2015 23:00:00 7/21/2015 0:00:00 testdatabase-21-07-15-23-00
7/22/2015 23:00:00 7/22/2015 0:00:00 testdatabase-22-07-15-23-00
7/21/2015 12:00:00 7/21/2015 0:00:00 testdatabase-21-07-15-12-00
7/21/2015 18:00:00 7/21/2015 0:00:00 testdatabase-21-07-15-18-00
7/22/2015 12:00:00 7/22/2015 0:00:00 testdatabase-22-07-15-12-00
7/22/2015 18:00:00 7/22/2015 0:00:00 testdatabase-22-07-15-18-00
dateFull : 7/21/2015 23:00:00
dateOnly : 7/21/2015 0:00:00
fileName : testdatabase-21-07-15-23-00
dateFull : 7/22/2015 23:00:00
dateOnly : 7/22/2015 0:00:00
fileName : testdatabase-22-07-15-23-00