Фильтр Time Debounce для CSV в Powershell - PullRequest
0 голосов
/ 23 января 2020

Итак, у меня есть парк грузовых автомобилей, который проезжает мимо лежачих полицейских. Бортовой самописец фиксирует время, когда грузовик преодолевает лежачий полицейский, идентификатор грузового автомобиля и идентификационный номер. Однако из-за проблем, связанных с устранением неполадок, иногда рекордер читает один и тот же удар дважды (и это не всегда последовательно)

"TIME","TRUCK","BUMP"
"2019-12-06 12:01:48 AM","TRUCK 12","BUMP 13"
"2019-12-06 12:01:53 AM","TRUCK 12","BUMP 14"
"2019-12-06 12:01:58 AM","TRUCK 12","BUMP 13"

Я хочу использовать сценарий powershell, чтобы отфильтровать последнюю строку, следующую этому правилу: «Удалите строку, если в течение последних X секунд один и тот же идентификатор грузовика обнаружил тот же идентификатор удара». Я понимаю, как делать простые фильтры столбцов (-like, -unique и т. Д. c), но я не уверен, как составить это условное выражение.

Любая помощь будет принята с благодарностью!

1 Ответ

2 голосов
/ 23 января 2020

Это выглядит довольно неуклюже, но работает:

$x = 10 # Seconds of Tolerance
$data = Import-Csv file.csv # File.csv contains your CSV data

$data | Group-Object -Property TRUCK,BUMP | Foreach-Object {
    $dateMax = ([datetime]$_.Group[0].Time).AddSeconds($x)
    $_.Group | Where { [datetime]$_.Time -lt $dateMax }
} | Sort-Object { [datetime]$_.Time }

Это предполагает, что ваши данные уже отсортированы по Time, что, по-видимому, в вашем образце.

Эта группа ваши строки CSV на TRUCK и BUMP. Каждая из этих групп сравнивает значения TIME и выводит только те строки, которые находятся в пределах времени ($x секунд). Поскольку группировка восстанавливает данные, их необходимо снова отсортировать на основе TIME. Я считаю, что в этом и заключается неэффективность, если она есть.

...