#powershell
#powershell
Вопрос:
не могли бы вы помочь мне со сценарием powershell:
В CSV-файле мне нужно вычесть дату столбца B из столбца C и записать результат в столбец A в формате 1 день = 24 часа и та же дата = 12 часов Иногда столбец B может содержать будущие значения, в этом случае столбец A должен содержать минус (-)
Это должно выглядеть так:
120 11/22/2020 11/27/2020
96 11/23/2020 11/27/2020
72 11/24/2020 11/27/2020
48 11/25/2020 11/27/2020
24 11/26/2020 11/27/2020
12 11/27/2020 11/27/2020
-24 11/28/2020 11/27/2020
-48 11/29/2020 11/27/2020
UPD
В моем скрипте есть пара дополнительных шагов перед вычитанием. Я беру необработанный файл с разделителями табуляции, конвертирую его в csv, сравниваю его с архивными файлами для устранения дубликатов, удаляю ненужное имя столбца «SrvDate» и заменяю его именем «TAT hh», а затем экспортирую его в файл. Итак, единственное, чего не хватает — сравнение дат и заполнение часов в «TAT / hh», вот оно с образцами данных:
Сценарий:
$in = Import-Csv (Get-ChildItem -Path E:TestRIIntestIn*.csv).Fullname -Delimiter "`t" | ? "Test Code" -in "Z620","Z630"
$in2 = Import-Csv (Get-ChildItem -Path E:TestRIIntestArc*.csv).Fullname
$pcomp = 'Accession'
$dup = Compare-Object $in $in2 -Property $pcomp -IncludeEqual -ExcludeDifferent -PassThru | Select-Object -ExpandProperty $pcomp
$badhead = $in | Where-Object {$_.$pcomp -notin $dup} | Select-Object *,@{Name='TAT/hh';Expression={$_.'TAT/hh'}} -Exclude 'SrvDate'
$goodhead = $badhead | Select-Object "Accession","TAT/hh","EntryDate","FinalReportDate","Patient First Name","Patient Last Name","DOB","Gender","Race","Ethnicity","Patient Address","Patient City","Patient State","Patient Zip","Patient Phone","Test Code","Test Name","Result","ClientID","Client Name","Phys ID","Phys Name"
if ($goodhead) {$goodhead | Where-Object {$_.$pcomp -notin $dup} | Export-Csv "E:TestRIIntestOutClient_PtRecords_$((Get-Date).ToString("yyyyMMdd")).csv" -NoTypeInformation}
Образец данных:
Accession SrvDate EntryDate FinalReportDate Patient First Name Patient Last Name DOB Gender Race Ethnicity Patient Address Patient City Patient State Patient Zip Patient Phone Test Code Test Name Result ClientID Client Name Phys ID Phys Name
--------- ------- --------- --------------- ------------------ ----------------- --- ------ ---- --------- --------------- ------------ ------------- ----------- ------------- --------- --------- ------ -------- ----------- -------- ----------
2132900941 NULL 11-24-2020 11-29-2020 MICHELL PENDERGRAS 9/30/1981 F U 35 RUSEVELT ST PRUDENCE RB 2909 (401)516-5642 Z620 Sars-COVID19 Positive 99984 "ASHRAF FARID, M.D." 50845 ATPAV RIGTED
2232900942 NULL 11-25-2020 11-29-2020 MICHEL PENDERGRA 9/30/1982 M U 315 RUSEVELT ST PRUDENCE RB 2909 (401)516-5643 Z620 Sars-COVID19 Positive 99984 "ASHRAF FARID, M.D." 50845 ATPAV RIGTED
2332900943 NULL 11-26-2020 11-29-2020 MICHE PENDERGR 9/30/1983 F U 325 RUSEVELT ST PRUDENCE RB 2909 (401)516-5644 Z620 Sars-COVID19 Positive 99984 "ASHRAF FARID, M.D." 50845 ATPAV RIGTED
2432900944 NULL 11-27-2020 11-29-2020 MICH PENDERG 9/30/1984 M U 335 RUSEVELT ST PRUDENCE RB 2909 (401)516-5645 Z620 Sars-COVID19 Positive 99984 "ASHRAF FARID, M.D." 50845 ATPAV RIGTED
2532900945 NULL 11-28-2020 11-29-2020 ALLISO JEZA 10/13/1977 F U 15 KAUTEEKEE AVE SOUTH PRUDENCE RB 2911 (908)930-9213 Z620 Sars-COVID19 Positive 99984 "ASHRAF FARID, M.D." 50845 ATPAV RIGTED
2632900946 NULL 11-29-2020 11-29-2020 ALLIS JEZ 10/13/1978 M U 151 KAUTEEKEE AVE SOUTH PRUDENCE RB 2911 (908)930-9214 Z620 Sars-COVID19 Positive 99984 "ASHRAF FARID, M.D." 50845 ATPAV RIGTED
2732900947 NULL 11-30-2020 11-29-2020 ALLI JE 10/13/1979 F U 152 KAUTEEKEE AVE SOUTH PRUDENCE RB 2911 (908)930-9215 Z620 Sars-COVID19 Positive 99984 "ASHRAF FARID, M.D." 50845 ATPAV RIGTED
2832900948 NULL 12-1-2020 11-29-2020 ALL J 10/13/1980 M U 153 KAUTEEKEE AVE SOUTH PRUDENCE RB 2911 (908)930-9216 Z620 Sars-COVID19 Positive 99984 "ASHRAF FARID, M.D." 50845 ATPAV RIGTED
UPD
Я использовал скрипт Алексей и вставил его в свой, но я столкнулся с проблемой объединения результатов двух разных вычислений.
В моем скрипте — я получаю результаты с правильными заголовками, только элементы поиска, экспорт только при наличии результатов и без дубликатов в $ goodhead.
В скрипте Алексей я получаю вычисления для времени выполнения в $ tat (я выбрал только вычисляемый столбец)
Есть ли способ заполнить $ tat в $ goodhead?
Вот мой обновленный код:
$in = Import-Csv (Get-ChildItem -Path E:TestRIIntestIn*.csv).Fullname -Delimiter "`t" | ? "Test Code" -in "Z620","Z630"
$in2 = Import-Csv (Get-ChildItem -Path E:TestRIIntestArc*.csv).Fullname
$pcomp = 'Accession'
$dup = Compare-Object $in $in2 -Property $pcomp -IncludeEqual -ExcludeDifferent -PassThru | Select-Object -ExpandProperty $pcomp
$badhead = $in | Where-Object {$_.$pcomp -notin $dup} | Select-Object *,@{Name='TAT/hh';Expression={$_.'TAT/hh'}} -Exclude 'SrvDate'
$goodhead = $badhead | Select-Object "Accession","TAT/hh","EntryDate","FinalReportDate","Patient First Name","Patient Last Name","DOB","Gender","Race","Ethnicity","Patient Address","Patient City","Patient State","Patient Zip","Patient Phone","Test Code","Test Name","Result","ClientID","Client Name","Phys ID","Phys Name"
$tatin = $goodhead | Select-Object * | % {
$EntryDate = [datetime]::parseexact($_.EntryDate, 'yyyy-MM-dd', $null)
$FinalReportDate = [datetime]::parseexact($_.FinalReportDate, 'yyyy-MM-dd', $null)
$tatcalc = switch (($FinalReportDate - $EntryDate).TotalDays){
0 {12}
default {$_ * 24}
}
[PSCustomObject]@{
'TAT/hh' = $tatcalc
EntryDate = $EntryDate
FinalReportDate = $FinalReportDate
}
}
$tat = $tatin | Select "TAT/hh"
if ($tat) {$tat | Sort-Object "Result" -Descending | Export-Csv "E:TestRIIntestOutClient_PtRecords_$((Get-Date).ToString("yyyyMMdd")).csv" -NoTypeInformation}
Спасибо!
PS Я всего лишь новичок в Powershell, пытаюсь изучить его в повседневных задачах.
Комментарии:
1. Добро пожаловать в StackOverflow, Александр. Возможно, это поможет отредактировать ваш вопрос с помощью примера ваших исходных данных и любых фрагментов кода, которые вы пробовали до сих пор.
2. Райан, спасибо за ваше предложение, я обновил.
Ответ №1:
$in = Import-Csv (Get-ChildItem -Path D:tmpalexClient_PtRecords_20201203.csv).Fullname -Delimiter "`t" | ? "Test Code" -in "Z620","Z630"
$in2 = Import-Csv (Get-ChildItem -Path D:tmpalexarcClient_PtRecords_20201202.csv).Fullname
$pcomp = 'Accession'
$dup = Compare-Object $in $in2 -Property $pcomp -IncludeEqual -ExcludeDifferent -PassThru | Select-Object -ExpandProperty $pcomp
$badhead = $in | Where-Object {$_.$pcomp -notin $dup} | Select-Object *,@{Name='TAT/hh';Expression={$_.'TAT/hh'}} -Exclude 'SrvDate'
$goodhead = $badhead | Select-Object "Accession", @{name = "TAT/hh"; expression = {switch(([datetime]::parseexact($_.FinalReportDate, 'yyyy-MM-dd', $null)-[datetime]::parseexact($_.EntryDate, 'yyyy-MM-dd', $null)).TotalDays){ 0 {12}; default {$_ * 24}}}},"EntryDate","FinalReportDate","Patient First Name","Patient Last Name","DOB","Gender","Race","Ethnicity","Patient Address","Patient City","Patient State","Patient Zip","Patient Phone","Test Code","Test Name","Result","ClientID","Client Name","Phys ID","Phys Name"
$tatin = $goodhead | Select-Object *
$tat = $tatin | Select "TAT/hh"
if ($tat) {$tat | Sort-Object "Result" -Descending | Export-Csv "D:tmpalexarcClient_PtRecords_$((Get-Date).ToString("yyyyMMdd")).csv" -NoTypeInformation}
Комментарии:
1. Алексей, спасибо за ваш ответ, я пытался вставить ваш скрипт в свой, но, к сожалению, чаще всего я получал строку, подобную этой «-17706144 11/26/2020 00:00:00 11/28/2020 00:00:00», поэтому мне нужно найти способ вставить его в мой сценарий.
2. неправильно ли сформирован CSV в «Образце данных»
3. Алексей, не могли бы вы объяснить мне, как правильно вставить ваш код в мой скрипт, чтобы я получал все данные в заголовках, перечисленных в $ goodhead (как я получаю сейчас), плюс данные, которые будут получены из вашего кода и будут заполнены в столбце «TAT hh». Спасибо!