首页 > 解决方案 > 如何从 powershell 中的 .txt 文件中获取一行的总和?

问题描述

所以,我有一个像这样的文本文件“numbers.txt”:

2 3 4 5
5 6
6 7 7
6 88 9 67 4
65 76 979 8
6 88 5 4 23

我的问题是,我怎样才能得到每行的总和?我试图做的事情:

$data=Get-Content -Delimiter " " numbers.txt
$data | % {
 $sum=0
 foreach($num in $_) {
 $sum+=$num
 }
 Write-Host $sum
 }

但它会返回奇怪的数字。我不知道如何分隔每一行中的不同数字并得到它们的总和。

标签: powershelltext-parsing

解决方案


这是一个使用 LINQ 的快速简洁的 PSv4+ 解决方案:

(Get-Content numbers.txt).ForEach({ 
  [Linq.Enumerable]::Sum([int[]] ($_ -split ' ')) 
})
  • (Get-Content numbers.txt)将输入文件的作为字符串数组返回。

  • .ForEach({ ... }{ ...})为每个输入行执行一个脚本块 ( )。

    • [Linq.Enumerable]::Sum(...)对数字数组(可枚举)的元素求和。

    • $_ -split ' '将手头的输入行 ( $_) 通过空格拆分为 (字符串) 标记,并将结果转换为整数数组( [int[]])。

这是一个更慢的解决方案,更接近您的尝试(也适用于 PSv3):

Get-Content numbers.txt | ForEach-Object {  # Process each line.
  $sum = 0 # initialize the sum (implicitly of type [int])
  foreach ($num in $_ -split ' ') { # Process all tokens on the line.
    # Note: Because $sum is [int]-typed, adding the *string* token at 
    #       hand implicitly converts it to [int].
    $sum += $num  
  }
  $sum # Output the sum - do NOT use Write-Host to output DATA
}

两种解决方案都产生以下结果:

14     # 2 + 3 + 4 + 5
11     # 5 + 6
20     # ...
174
1128
126

至于你尝试了什么:

Get-Content -Delimiter " " numbers.txt

这会将您的整个文件拆分为单个数字字符串数组,而忽略行边界。

相反,您必须Get-Content按原样使用,以便逐行处理文件,然后将每一行拆分为以空格分隔的标记进行汇总。


推荐阅读