如何从 powershell 中的 .txt 文件中获取一行的总和?
How can i get the sum of a line from a .txt file in powershell?
所以,我有一个这样的文本文件 "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
}
但它会返回奇怪的数字。
我不知道如何将每行中的不同数字分开并求出它们的总和。
这是一个利用 LINQ 的快速简洁的 PSv4+ 解决方案:
(Get-Content numbers.txt).ForEach({
[Linq.Enumerable]::Sum([int[]] ($_ -split ' '))
})
(Get-Content numbers.txt)
returns 输入文件的 行 作为字符串数组。
.ForEach({ ... }
) 为每个输入行执行一个脚本块 ({ ...}
)。
[Linq.Enumerable]::Sum(...)
对数字数组(可枚举)的元素求和。
$_ -split ' '
将手头的输入行 ($_
) 拆分为 space 的(字符串)标记,并将结果转换为 整数 ([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
以便逐行 处理文件 ,然后拆分 每行 转换为 space 分隔的标记以求和。
将其转换为单个数字数组:
-split (get-content numbers.txt) | measure -sum | % sum
1473
糟糕,对每一行求和:
get-content numbers.txt | foreach { -split $_ | measure -sum } | foreach sum
14
11
20
174
1128
126
所以,我有一个这样的文本文件 "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
}
但它会返回奇怪的数字。 我不知道如何将每行中的不同数字分开并求出它们的总和。
这是一个利用 LINQ 的快速简洁的 PSv4+ 解决方案:
(Get-Content numbers.txt).ForEach({
[Linq.Enumerable]::Sum([int[]] ($_ -split ' '))
})
(Get-Content numbers.txt)
returns 输入文件的 行 作为字符串数组。.ForEach({ ... }
) 为每个输入行执行一个脚本块 ({ ...}
)。[Linq.Enumerable]::Sum(...)
对数字数组(可枚举)的元素求和。$_ -split ' '
将手头的输入行 ($_
) 拆分为 space 的(字符串)标记,并将结果转换为 整数 ([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
以便逐行 处理文件 ,然后拆分 每行 转换为 space 分隔的标记以求和。
将其转换为单个数字数组:
-split (get-content numbers.txt) | measure -sum | % sum
1473
糟糕,对每一行求和:
get-content numbers.txt | foreach { -split $_ | measure -sum } | foreach sum
14
11
20
174
1128
126