powershell csv вычитает значение даты в одном столбце из другого и запишет результат в третий, где 1 день равен 24 часам

#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». Спасибо!