Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何按共享列值对CSV行进行分组和求和?_Windows_Powershell_Csv_Grouping - Fatal编程技术网

Windows 如何按共享列值对CSV行进行分组和求和?

Windows 如何按共享列值对CSV行进行分组和求和?,windows,powershell,csv,grouping,Windows,Powershell,Csv,Grouping,我是powershell的新手,目前遇到了一个问题 我导入一个包含两列(服务器名和大小)的CSV文件 像这样: Server | Size ------------- SRV1 | 140 SRV2 | 120 SRV1 | 100 SRV1 | 140 SRV2 | 200 我想为每个服务器添加所有大小值,例如: SRV2 = 120+200 SRV1 = 140+100+140 我不知道怎么做。 我尝试使用for循环,但操作是针对每一行进行的,因此我的结果是错

我是powershell的新手,目前遇到了一个问题

我导入一个包含两列(服务器名和大小)的CSV文件 像这样:

Server | Size
-------------
SRV1   | 140

SRV2   | 120

SRV1   | 100

SRV1   | 140

SRV2   | 200
我想为每个服务器添加所有大小值,例如:

SRV2 = 120+200
SRV1 = 140+100+140
我不知道怎么做。 我尝试使用for循环,但操作是针对每一行进行的,因此我的结果是错误的。
有人能帮我吗?

这里有一个例子,你可以这样做:

$Data = Import-Csv -Path "yourfilepath" -Delimiter ";"

$SortedData = $Data | Group {$_.server}
$Hashtable = @{}
$SortedData.group | ForEach-Object {
    if ($Hashtable.Contains($_.server)) {
        $Hashtable[$_.server] += ",$($_.size)"
    } else {
        $Hashtable.Add($_.server,$_.size)
    }
}

您需要在您的案例中更改分隔符

以下是一个示例:

$Data = Import-Csv -Path "yourfilepath" -Delimiter ";"

$SortedData = $Data | Group {$_.server}
$Hashtable = @{}
$SortedData.group | ForEach-Object {
    if ($Hashtable.Contains($_.server)) {
        $Hashtable[$_.server] += ",$($_.size)"
    } else {
        $Hashtable.Add($_.server,$_.size)
    }
}
您需要更改案例中的分隔符

使用:

  • 要按服务器名称对CSV行进行分组(
    server
  • 然后使用为每个组构造一个输出对象
  • 包含服务器名称和所有关联行的Size值之和,通过使用以下值的
如果希望将第一个输出列命名为
Server
,请将
Name
替换为
{n='Server';e='Name'}

根据您的样本数据,上述结果如下:

Name Size
---- ----
SRV1  380
SRV2  320
使用:

  • 要按服务器名称对CSV行进行分组(
    server
  • 然后使用为每个组构造一个输出对象
  • 包含服务器名称和所有关联行的Size值之和,通过使用以下值的
如果希望将第一个输出列命名为
Server
,请将
Name
替换为
{n='Server';e='Name'}

根据您的样本数据,上述结果如下:

Name Size
---- ----
SRV1  380
SRV2  320

谢谢你的回答。如果我的CSV包含两个以上不同的服务器,它还能工作吗?因为在我的示例中,我有2台服务器,但事实上,它可以是3台或4台。它应该可以与任意数量的服务器一起工作,请在解决问题时将答案标记为解决方案。我认为目的是实际求和值(相加并报告总和),而不是生成加法操作的字符串表示。还请注意,使用哈希表不能保证条目的顺序。谢谢您的回答。如果我的CSV包含两个以上不同的服务器,它还能工作吗?因为在我的示例中,我有2台服务器,但事实上,它可以是3台或4台。它应该可以与任意数量的服务器一起工作,请在解决问题时将答案标记为解决方案。我认为目的是实际求和值(相加并报告总和),而不是生成加法操作的字符串表示。还要注意,使用哈希表不能保证条目的顺序。