0

希望你能帮助我解决这个小难题。

我有一个 txt 文件,如下所示:

第一个数字

348.92

237

230

329.31

秒数

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 文件中会更酷一些,就像前面提到的在每一行数字上都有一个标题。

我已经尝试删除以 ie$a.Replace("first", $null).Replace("sec", $null) and then doing a $b.Split(" ")[1,2,3,4,5]结尾的标题,| measure -sum 这给了我正确数量的 firstnumbers - 但如果我不每次都保留特定的数字集,它将不起作用。他们会改变,而且会或多或少。

我猜这应该很容易。此刻我似乎无法把头绕在它周围。

任何建议都会很棒!

干杯

4

2 回答 2

0

这是另一种方法,而不是将文本解析为一个大块,您可以测试每一行以查看它是否包含 # 或文本,如果是文本,则它会触发在存储总和的哈希表中创建新条目:

# 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;}
于 2013-05-29T00:34:45.117 回答
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
于 2013-05-28T21:50:26.197 回答