PowerShell 文本处理实例(一) 6


问题描述:

有如下一段文本文件,开头有许多描述,字符“~”为有用数据的开始标志,要求:求所有电阻值的个数,平均值,总和,最大值,最小值。

这是一份格式较为规则的文本文件报表。
#文件头有一些无用的描述信息

~
深度         电阻值      放射性值
10            1.5            2.4
20            0.4            1.9
30            2.5            0.5
40            1.3
50            3.1


先不解释,直接贴脚本:

#加载文件,并过滤空行
$fullText=Get-Content .\a.txt | where { !([string]::IsNullOrWhiteSpace($_))}
#寻找文件头开始标志
$startFlagIndex=-1
For ($i = 0; $i -lt $fullText.Length; $i++)
   { 
      if($fullText[$i].Contains("~"))
      {
        $startFlagIndex=$i
        break
      } 

   }
#去掉文件头
$fullText=$fullText | Select-Object -Skip ($startFlagIndex+1)

<#
 #将文件转换成CSV格式,然后再从CSV转换成对象
 #几经周折后,再要深入进行数据处理,将会变得非常方便 
#>
$objs=$fullText | foreach{
    $tokens= $_.Split(' ',[StringSplitOptions]::RemoveEmptyEntries)
    '"{0}"' -f [string]::Join('","',$tokens) 
} | ConvertFrom-Csv 

#统计放射性值不为空的对象
Write-Host "统计放射性值为空的对象"
$objs | where { $_.放射性值 -ne $null } | Format-Table -AutoSize

#求所有电阻值的个数,平均值,总和,最大值,最小值
Write-Host "求所有电阻值的个数,平均值,总和,最大值,最小值:"
$objs |  Measure-Object -Property 电阻值 -Average -Sum -Maximum -Minimum

输出示例:

统计放射性值为空的对象

深度 电阻值 放射性值
-- --- ----
10 1.5 2.4 
20 0.4 1.9 
30 2.5 0.5 

求所有电阻值的个数,平均值,总和,最大值,最小值:

Count    : 5
Average  : 1.76
Sum      : 8.8
Maximum  : 3.1
Minimum  : 0.4
Property : 电阻值

回过头再看,脚本完全可以优化为一个foreach循环,每行文本只遍历一次。之所以多次一举,是为了演示分析问题的过程。
同样也能得出一个结论,如果可以尽最大可能从数据源拿到CSV文件格式的数据,PowerShell处理起来更方便,一行搞定!

×用微信扫描并分享
本文链接: https://www.pstips.net/processing-text-1.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

6 条评论 “PowerShell 文本处理实例(一)

  • vaster

    你好,我是初学powershell,我想过滤出空白行,为什么会提示出错呢?我用的你上面那个语句做的。(说方法不存在)
    谢谢指导 ^_^
    提示如下:
    方法调用失败,因为 [System.String] 不包含名为“IsNullOrWhiteSpace”的方法。
    所在位置 行:1 字符: 71
    + $fullText=Get-Content .\a.txt | where { !([string]::IsNullOrWhiteSpace <<<< ($_))}
    + CategoryInfo : InvalidOperation: (IsNullOrWhiteSpace:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

  • wangchuan

    发现两处有点问题:
    1、寻找文件头开始标志,遍历数组元素从第一个开始,i 应该初始化为0;
    2、从代码和运行结果看,注解应该是“统计放射性值不为空的对象”;

  • GitHubFatherIsMe

    博主你好,在你上附的这段代码中我这一段每太看懂,望求教,谢谢!
    $objs=$fullText | foreach{
    $tokens= $_.Split(‘ ‘,[StringSplitOptions]::RemoveEmptyEntries)
    ‘”{0}”‘ -f [string]::Join(‘”,”‘,$tokens)
    } | ConvertFrom-Csv
    同时还有一个问题,一直在看博主的博客,对poweshell的编写风格,语法有了一定了解,但是一直存在一些困难,就是对于一些函数,或者com对象很陌生,甚至不知道他们的存在,请问我可以从哪些途径学习呢?谢谢!