Сортировка каждого столбца и отображение только наибольшего значения из CSV - powershell - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь отсортировать список столбцов в CSV.Он не сортируется в правильном формате, так как тип объекта - system.array.

Я могу получить значение для одного столбца индивидуально, выполнив приведение типа.Есть ли способ сделать приведение типов для всех столбцов.Приведенный ниже код работает только для одного столбца.

отметка времени | abc | A | B | C | D | E | F | G |<br> 6/4/2019 | 6775 | 3059 | 4 | 2292 | 1328 | 764 | 0 | 0 |<br> 6/4/2019 | 6910 | 3167 | 28 | 3568 | 1180 | 1348 | 0 | 0 |<br> 6/4/2019 | 6749 | 3161 | 0 | 2180 | 2060 | 1440 | 0 | 28 |<br> 6/5/2019 | 6738 | 3118 | 4 | 2736 | 1396 | 984 | 0 | 0 |<br> 6/5/2019 | 6718 | 3130 | 12 | 3076 | 1008 | 452 | 0 | 4 |<br> 6/5/2019 | 6894 | 3046 | 4 | 2284 | 1556 | 624 | 0 | 0 |

Это образец данных CSV.

$csv=Import-Csv 'M:\MyDoc\script\logfiles\streams_OUTPUT.csv'
$uniquedates=$csv |select timestamp -Unique 
$resultTab  = @();
foreach ($d in $uniquedates)
$array_name = $csv |where {$_.timestamp -like $d.timestamp } | Sort- Object @{expression={if($_.A){[int[]]$_.A}}} -Descending | Select -First 1
$resultTab += $array_name;
}
$resultTab | FT

Мой желаемый результат, который я ищу: timestamp streams A B C D E F G<br> 6/4/2019 6910 3167 28 3568 2060 1440 0 28 6/5/2019 6894 3130 12 3076 1556 984 0 4

1 Ответ

0 голосов
/ 07 июня 2019

[edit - изменил пример данных на новую версию и изменил код для работы с новыми спецификациями.]

вот один из способов сделать эту работу.[ ухмылка ] он использует способ, которым PoSh позволяет получить все значения одного свойства из коллекции одним махом.$Collection.PropName даст вам все значения, с которыми можно работать.

# fake reading in a CSV
#    in real life, use Import-CSV
$InStuff = @'
timestamp, abc, A, B, C, D, E, F, G
6/4/2019, 6775, 3059, 4, 2292, 1328, 764, 0, 0
6/4/2019, 6910, 3167, 28, 3568, 1180, 1348, 0, 0
6/4/2019, 6749, 3161, 0, 2180, 2060, 1440, 0, 28
6/5/2019, 6738, 3118, 4, 2736, 1396, 984, 0, 0
6/5/2019, 6718, 3130, 12, 3076, 1008, 452, 0, 4
6/5/2019, 6894, 3046, 4, 2284, 1556, 624, 0, 0
'@ | ConvertFrom-Csv

$TargetPropertyList = $InStuff[0].PSObject.Properties.Name.Where({$_ -ne 'TimeStamp'})

$GroupedInStuff = $InStuff |
    Group-Object -Property TimeStamp

$Results = foreach ($GIS_Item in $GroupedInStuff)
    {
    $HighestValues = [ordered]@{
        TimeStamp = $GIS_Item.Name
        }
    foreach ($TPL_Item in $TargetPropertyList)
        {
        $TempHiVal = ($GIS_Item.Group.$TPL_Item.ForEach({[int]$_}) | Sort-Object)[-1]
        $HighestValues.Add($TPL_Item, $TempHiVal)
        }

    [PSCustomObject]$HighestValues
    }

$Results = $Results |
    Sort-Object -Property {[datetime]$_.TimeStamp}

$Results |
    Format-Table

output ...

TimeStamp  abc    A  B    C    D    E F  G
---------  ---    -  -    -    -    - -  -
6/4/2019  6910 3167 28 3568 2060 1440 0 28
6/5/2019  6894 3130 12 3076 1556  984 0  4

пожалуйста, не забывайте НЕ использовать Format-Table [или другие Format-* командлеты] для чего-либо, кроме final display или вывод в текстовый файл .они нарезают ваши объекты, упаковывают их в код форматирования , а затем выплевывают их.он будет выдавать мусор, если вы попытаетесь использовать вывод для любой дополнительной работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...