希望你能帮助我解决这个小难题。
我有一个txt文件,如下所示:
firstnumbers
348.92
237
230
329.31
secondnumbers
18.21
48.92
37
30
29.31
这是一个txt文件,其中一列有2个字符串,每行有一些数字。
我想取每列的总数并将其放入每个变量中,比如说$ a和$ b 是的它是1列,只是为了确保没有误解
如果我对每列数字使用2个文件而没有标题(字符串)
,这很容易$a = (Get-Content 'firstnumbers.txt' | Measure-Object -Sum).Sum
$b = (Get-Content 'secondnumbers.txt' | Measure-Object -Sum).Sum
但是将它们放在一个txt文件中会更酷一点,就像前面提到的那样,每行都有一个标题。
我尝试删除$a.Replace("first", $null).Replace("sec", $null) and then doing a $b.Split(" ")[1,2,3,4,5]
以| measure -sum
结尾的标题
这给了我正确数量的第一个数字 - 但是如果我每次都没有保留特定的数字,它将无法工作。他们会改变,而且会有更多或更少。
我猜这应该很容易。我现在似乎无法掩饰其中的一切。
任何建议都很棒!
欢呼声
答案 0 :(得分:0)
这样的事情应该有效:
$file = "C:\path\to\your.txt"
[IO.File]::ReadAllText($file) | % {
$_ -replace "`n+([0-9])", ' $1' -split "`n"
} | ? { $_ -ne "" } | % {
$a = $_ -split " ", 2
$v = $a[1] -split " " | Measure-Object -Sum
"{0}`t{1}" -f ($a[0], $v.Sum)
}
输出:
firstnumbers 1145,23
secondnumbers 163,44
答案 1 :(得分:0)
这是另一种方法,而不是将文本解析为一个大blob,您可以测试每一行以查看它是否包含#或文本,如果是文本,则它会触发在哈希表中创建新条目总和存储:
# C:\Temp> get-content .\numbers.txt | foreach{
$val=0;
if([Decimal]::TryParse($_,[ref]$val)){
$sums[$key]+=$val
}else{
$sums += @{"$_"=0}; #add new entry to hashtable
$key=$_;}
} -end {$sums}
Name Value
---- -----
secondnumbers 163.44
firstnumbers 1145.23
编辑如评论中所述,每次运行都会保留$ sums变量,如果您运行此命令两次会导致问题。您可以在每次运行后调用Remove-variable sums
,或者将其添加到end
处理块中,如下所示:
# C:\Temp> get-content .\numbers.txt | foreach{
$val=0;
if([Decimal]::TryParse($_,[ref]$val)){
$sums[$key]+=$val
}else{
$sums += @{"$_"=0}; #add new entry to hashtable
$key=$_;}
} -end {$sums; remove-variable sums;}