У меня есть 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
Я создаю один каталог для каждого пользователя и хочу разместить один csv с диапазоном даты и времени -30/+30 минут для каждой строки с этим пользователем.
Итак, вы хотите дополнительный уровень группировки для каждого пользователя? Ваш вопрос на самом деле не говорит об этом.
Нет группировки по пользователям в csv. Я группирую пользователя каталога, которого я создал. Я надеюсь, я ясно извините
Желаемый результат все еще неясен. Пожалуйста, работайте с вашими образцами данных и покажите все файлы CSV, которые вы хотите создать из них, их имена и строки, которые они должны содержать.
Извините, я отредактировал вопрос с ожидаемыми данными образцов
Итак, на простом английском языке — поправьте меня, если я ошибаюсь: вам нужна одна папка для каждого пользователя («сгруппированная по пользователю») с файлом CSV, который содержит все события этого пользователя, плюс полчаса «контекста» до и после каждого (независимо от того, какому пользователю они принадлежат).
Точно. Извините за мой английский :)
Вы показываете ввод CSV в виде таблицы. Это легко читать, но фактический текст CSV может быть более информативным для наших целей. Неясно, ожидаете ли вы, что поля будут разделены запятыми или точками с запятой. Это зависит от культуры, и по крайней мере один из ответов относится к европейской культуре, где ответом является точка с запятой.
Export-Csv определенно находится не в том месте. Вы не вызываете этот командлет один раз для каждой записи. Вместо этого вы передаете поток записи в Export-CSV, который вызываете один раз. Внутри Powershell превращает ваш единственный вызов в вызов внутри цикла, но именно так работают конвейеры. Вы не должны делать эту работу.
Задание согласно комментариям:
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"
Не совсем понятно, как должен выглядеть ваш вывод. Создание групп строк по дате возможно, но тогда каждая группа будет содержать несколько разных значений
Users
. Как это переводится в выходной путь, например".\$($_.Users)\time.csv"
?