Найдите последнюю строку на основе времени и отобразите их

У меня есть текстовый файл как показано ниже:

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, я должен получить последнее (который равняется 23) от многих из 21. То же как случай для 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
 }
 }

Как я мог сделать это.? Любая справка действительно ценилась бы.

0
задан 23 July 2015 в 12:53
2 ответа

Я думаю, вам нужен новый подход. Если разобрать ваш файл в хеш-таблицу, то вы сможете получить последнюю дату + время по дате.

# 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

После этих манипуляций вы можете получить доступ к массиву по ключу вида <день> - <месяц> - <год> и получить из него последний элемент:

$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
0
ответ дан 5 December 2019 в 12:36

Я использовал настраиваемый объект для организации списка с тремя свойствами: имя файла, полная дата, только дата. Значения даты приводятся и сохраняются как фактические переменные [datetime]. Имея это истинное время, вы можете использовать собственные функции группировки и сортировки PowerShell, чтобы получать самый последний файл за каждый день.

Я нахожусь в США, где моя ОС по умолчанию установлена ​​на mm / dd / yy. Если в вашем регионе разные значения по умолчанию, вам может потребоваться отрегулировать правую сторону назначения var для $ dateFull и $ dateOnly.

$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
0
ответ дан 5 December 2019 в 12:36

Теги

Похожие вопросы