【问题标题】:Display value from all file after merging in single csv合并单个 csv 后显示所有文件的值
【发布时间】:2022-01-11 11:28:46
【问题描述】:

我有 12 个 csv 文件,我正在读取并根据条件将其合并到单个 csv 中。

但在合并后,我只能在每台服务器上获得一条记录,因为我使用了$_.Group[0]

下面是我的代码

$allFiles = Import-Csv -Path  (Get-ChildItem -Path C:\Files\ -Filter '*.csv').FullName

$Final_Data = $allFiles | Group-Object VM | Select-Object Name,Count, @{n='Start';e={$_.Group[0].Start}},@{n='Host';e={$_.Group[0].Host}}, @{n='VMDiskLatency';e={$_.Group[0].VMDiskLatency}},@{n='Datastore';e={$_.Group[0].Datastore}} | Where-Object {$_.Count -ge 5} | Export-Csv -Path "C:\Files\Final_Report.csv" -NoTypeInformation

数据如下$allFiles

Start                 Host                  VMDiskLatency Datastore                                                                                                               
-----                 ----                  ------------- ---------                                                                                                               
1/11/2022 8:12:01 AM  t02.r                    94            MGT_1d59
1/11/2022 8:12:01 AM  z02.r                    81            Z_3255_325a                                                                             
1/11/2022 8:12:01 AM  n34.r                    108           EN_259b                                                                              
1/11/2022 8:12:01 AM  n35.r                    210           EN_259b                                                                                 
1/11/2022 8:12:01 AM  n37.r                    104           EN_f5bf                                                                                     

使用我的代码,我得到如下的最终输出

Name           Count    Start                Host           VMDiskLatency   Datastore
TN2AP           12  1/11/2022 8:12            n34.r            108           GEN_319c
TN1AP           12  1/11/2022 8:12            n35.r            210           GEN_259b
TN4AP           12  1/11/2022 8:12            n37.r            104           GEN_f5bf
H1SC            12  1/11/2022 8:12            n34.r            202           GEN_7a29

但我正在寻找的输出就像例如给 1 台服务器

Name           Count    Start                 Host          VMDiskLatency   Datastore
TN2AP           12  1/11/2022 8:12            n34.r            108           GEN_319c
                    1/11/2022 7:12                             201
                    1/11/2022 6:12                             182
                    1/11/2022 8:42                             103
                    1/11/2022 8:22                             66
                    1/11/2022 5:12                             99
                    1/11/2022 4:12                             541
                    1/11/2022 9:12                             100
                    1/11/2022 8:12                             209
                    1/11/2022 6:32                             115
                    1/11/2022 8:12                             78
                    1/11/2022 8:12                             62

上面的服务器出现了 12 次(意味着在所有 csv 文件中),所以对于 StartVMDiskLatency,应该有所有 12 个条目。 如果是 6,那么所有 6 个条目等等..

请告诉我该怎么做。

【问题讨论】:

  • 也许你想改用... |Group-Object VM |Select-Object Name,Count -ExpandProperty Group
  • @MathiasR.Jessen:我会试一试,但我只想要帖子中提到的 2 列的所有值。不适合所有人。因为所有其他列在 csv 文件中将具有相同的值
  • 那么 CSV 可能不是您想要的格式。如果您从“连续”行中省略列值,那么任何人都可以通过简单地重新排序行来弄乱您的数据集。
  • @MathiasR.Jessen:明白了。我可以选择退出。可以显示所有列值。但必须根据计数显示所有这些。我们计划安排并通过邮件发送。所以我们现在可以做很多事情来防止数据发生任何变化。

标签: powershell csv


【解决方案1】:

如果您只想附加在每个组中的第一个对象上设置的 NameCount 值,请进行两个不同的选择 - 一个用于第一个对象属性值,一个用于属性值为空的其余对象:

$allFiles |Group-Object VM |Where-Object {$_.Count -ge 5} |ForEach-Object {
  $name = $_.Name
  $count = $_.Count

  $first,$rest = $_.Group

  $first | Select-Object @{Name='Name';Expression={$name}},@{Name='Count';Expression={$count}},'Start','Host','VMDiskLatency','Datastore' 
  $rest | Select-Object @{Name='Name';Expression={""}},@{Name='Count';Expression={""}},'Start','Host','VMDiskLatency','Datastore' 
} | Export-Csv -Path "C:\Files\Final_Report.csv" -NoTypeInformation

我个人建议保留附加到组中每个对象的值,这样您可以在不丢失上下文的情况下重新排序数据 - 并且您的表达变得更加简单:

$allFiles |Group-Object VM |Where-Object {$_.Count -ge 5} |Select-Object Name,Count -Expand Group |Export-Csv -Path "C:\Files\Final_Report.csv" -NoTypeInformation

【讨论】:

  • 尝试了您的第一个解决方案。收到错误At line:8 char:8 + $rest | Select-Object @{Name='Name';Expression={""},@{Name='Count' ... + ~ Missing '=' operator after key in hash literal. At line:8 char:8 + $rest | Select-Object @{Name='Name';Expression={""},@{Name='Count' ... + ~ The hash literal was incomplete. + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : MissingEqualsInHashLiteral
  • @EmptyCoder 属性定义中的错字,再试一次
  • 如何包含其他列,例如名称和计数?
  • @EmptyCoder 我不明白这个问题。这两个例子都包括NameCount
  • 根据您的第一个代码,名称和计数值出现一次然后为空白。我需要相同的主机和数据存储以及帖子中提到的。要做到这一点,我必须做些什么改变?
猜你喜欢
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 2022-01-26
  • 2018-09-15
  • 1970-01-01
相关资源
最近更新 更多