У меня есть текстовый файл как показано ниже:
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
}
}
Как я мог сделать это.? Любая справка действительно ценилась бы.
Я думаю, вам нужен новый подход. Если разобрать ваш файл в хеш-таблицу, то вы сможете получить последнюю дату + время по дате.
# 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
Я использовал настраиваемый объект для организации списка с тремя свойствами: имя файла, полная дата, только дата. Значения даты приводятся и сохраняются как фактические переменные [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