根据时间查找最新的字符串并显示

根据时间查找最新的字符串并显示

我有一个如下所示的文本文件:

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

相关内容