Экспорт Powershell в csv — динамический диапазон дат

У меня есть csv с пользователем и датой и временем

Users DHMS          
----- ----          
A     22/12/21 05:02:00
B     22/12/21 05:10:00
C     22/12/21 06:30:00
D     23/12/21 12:30:00
A     23/12/21 12:35:00
B     23/12/21 12:45:00
C     26/12/21 10:32:00
D     28/12/21 11:15:00
A     29/12/21 14:17:00
B     29/12/21 14:25:00

Есть ли простой способ извлечь из каждой строки новый csv со строками между -30 минутами/+ 30 минутами

я пытаюсь сделать это

$culture = [Globalization.CultureInfo]::InvariantCulture
$Data = Import-Csv '.\test.csv' 

$Data | ForEach-Object {

    $DHMS = [DateTime]::ParseExact($($_.DHMS), 'dd/MM/yy HH:m:s', $culture)

    
$DHMSmoins = $DHMS.AddMinutes(-30)
$DHMSplus =  $DHMS.AddMinutes(30)


$path = ".\" + $($_.Users) +"\time.csv"


$Data | where { $DHMS  -ge $DHMSmoins  -and $DHMS -le $DHMSplus }
$Data | Export-Csv $path

}

но проблемы:

1/ неправильный экспорт диапазона дат

2/есть несколько пользователей, поэтому экспортируется только строка последнего пользователя. Есть ли способ объединить разные csv в один

Надеюсь быть более ясным для Томалака

В папке CSV с

A     22/12/21 05:02:00
B     22/12/21 05:10:00
D     23/12/21 12:30:00
A     23/12/21 12:35:00
B     23/12/21 12:45:00
A     29/12/21 14:17:00
B     29/12/21 14:25:00

в папке Б CSV с

A     22/12/21 05:02:00
B     22/12/21 05:10:00
D     23/12/21 12:30:00
A     23/12/21 12:35:00
B     23/12/21 12:45:00
A     29/12/21 14:17:00
B     29/12/21 14:25:00

В папке С CSV с

C     22/12/21 06:30:00
C     26/12/21 10:32:00

В папке Д CSV с

D     23/12/21 12:30:00
A     23/12/21 12:35:00
B     23/12/21 12:45:00
D     28/12/21 11:15:00

Не совсем понятно, как должен выглядеть ваш вывод. Создание групп строк по дате возможно, но тогда каждая группа будет содержать несколько разных значений Users. Как это переводится в выходной путь, например ".\$($_.Users)\time.csv"?

Tomalak 09.04.2022 12:22

Я создаю один каталог для каждого пользователя и хочу разместить один csv с диапазоном даты и времени -30/+30 минут для каждой строки с этим пользователем.

Marmotte73 09.04.2022 12:37

Итак, вы хотите дополнительный уровень группировки для каждого пользователя? Ваш вопрос на самом деле не говорит об этом.

Tomalak 09.04.2022 12:46

Нет группировки по пользователям в csv. Я группирую пользователя каталога, которого я создал. Я надеюсь, я ясно извините

Marmotte73 09.04.2022 12:56

Желаемый результат все еще неясен. Пожалуйста, работайте с вашими образцами данных и покажите все файлы CSV, которые вы хотите создать из них, их имена и строки, которые они должны содержать.

Tomalak 09.04.2022 12:56

Извините, я отредактировал вопрос с ожидаемыми данными образцов

Marmotte73 09.04.2022 13:05

Итак, на простом английском языке — поправьте меня, если я ошибаюсь: вам нужна одна папка для каждого пользователя («сгруппированная по пользователю») с файлом CSV, который содержит все события этого пользователя, плюс полчаса «контекста» до и после каждого (независимо от того, какому пользователю они принадлежат).

Tomalak 09.04.2022 14:03

Точно. Извините за мой английский :)

Marmotte73 09.04.2022 14:34

Вы показываете ввод CSV в виде таблицы. Это легко читать, но фактический текст CSV может быть более информативным для наших целей. Неясно, ожидаете ли вы, что поля будут разделены запятыми или точками с запятой. Это зависит от культуры, и по крайней мере один из ответов относится к европейской культуре, где ответом является точка с запятой.

Walter Mitty 09.04.2022 15:29

Export-Csv определенно находится не в том месте. Вы не вызываете этот командлет один раз для каждой записи. Вместо этого вы передаете поток записи в Export-CSV, который вызываете один раз. Внутри Powershell превращает ваш единственный вызов в вызов внутри цикла, но именно так работают конвейеры. Вы не должны делать эту работу.

Walter Mitty 09.04.2022 15:45
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
10
34
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Задание согласно комментариям:

one folder per user ("grouped by user") with a CSV file that contains all the events of that user, plus half an hour of "context" before and after each (independently of which user they belong to).

Вот как бы я это сделал:

$rows = Import-Csv '.\test.csv' -Delimiter ";" | foreach {
    [pscustomobject]@{
        date = [DateTime]::ParseExact($_.DHMS, 'dd/MM/yy HH:m:s', [Globalization.CultureInfo]::InvariantCulture)
        row = $_
    }
}

$rows | group { $_.row.Users } | foreach {
    $user = $_.Name
    $filename = ".\$user\time.csv"

    # get context events (n.b.: this will contain duplicates!)
    $events = $_.Group | foreach {
        $start = $_.date.AddMinutes(-30)
        $until = $_.date.AddMinutes(30)
        ($rows | where { $_.date -ge $start -and $_.date -le $until }).row
    }

    # consolidate duplicates
    $index = @{}
    $uniqueEvents = foreach ($event in $events) {
        if (-not $index.ContainsKey($event)) {
            $index[$event] = $true
            $event
        }
    }

    Write-Host $filename -ForegroundColor Cyan
    Write-Host ($uniqueEvents | ConvertTo-Csv -Delimiter ";" -NoTypeInformation) -Separator "`r`n"  -ForegroundColor DarkCyan
    # $uniqueEvents | Export-Csv $filename -Delimiter ";" -NoTypeInformation
}

который печатает желаемый результат для ваших образцов данных:

.\A\time.csv
"Users";"DHMS"
"A";"22/12/21 05:02:00"
"B";"22/12/21 05:10:00"
"D";"23/12/21 12:30:00"
"A";"23/12/21 12:35:00"
"B";"23/12/21 12:45:00"
"A";"29/12/21 14:17:00"
"B";"29/12/21 14:25:00"
.\B\time.csv
"Users";"DHMS"
"A";"22/12/21 05:02:00"
"B";"22/12/21 05:10:00"
"D";"23/12/21 12:30:00"
"A";"23/12/21 12:35:00"
"B";"23/12/21 12:45:00"
"A";"29/12/21 14:17:00"
"B";"29/12/21 14:25:00"
.\C\time.csv
"Users";"DHMS"
"C";"22/12/21 06:30:00"
"C";"26/12/21 10:32:00"
.\D\time.csv
"Users";"DHMS"
"D";"23/12/21 12:30:00"
"A";"23/12/21 12:35:00"
"B";"23/12/21 12:45:00"
"D";"28/12/21 11:15:00"

Другие вопросы по теме