问题描述:
有如下一段文本文件,开头有许多描述,字符“~”为有用数据的开始标志,要求:求所有电阻值的个数,平均值,总和,最大值,最小值。
这是一份格式较为规则的文本文件报表。 #文件头有一些无用的描述信息 ~ 深度 电阻值 放射性值 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
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
你好,我是初学powershell,我想过滤出空白行,为什么会提示出错呢?我用的你上面那个语句做的。(说方法不存在)
谢谢指导 ^_^
提示如下:
方法调用失败,因为 [System.String] 不包含名为“IsNullOrWhiteSpace”的方法。
所在位置 行:1 字符: 71
+ $fullText=Get-Content .\a.txt | where { !([string]::IsNullOrWhiteSpace <<<< ($_))}
+ CategoryInfo : InvalidOperation: (IsNullOrWhiteSpace:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
[string]::IsNullOrWhiteSpace()是.NET 4.0以后新加的一个方法。但是你用的是PowerShell 2.0,默认的 运行时是.NET 2.0。
你可以使用方法[string]::IsNullOrEmpty($mystr.Trim()) 来代替。
另外如果你想启动.NET 4.o Runtime,可以参考:
http://www.pstips.net/powershell-support-higher-version-dotnet.html
非常感谢,对我很有帮助。
发现两处有点问题:
1、寻找文件头开始标志,遍历数组元素从第一个开始,i 应该初始化为0;
2、从代码和运行结果看,注解应该是“统计放射性值不为空的对象”;
感谢提醒,已更正。
博主你好,在你上附的这段代码中我这一段每太看懂,望求教,谢谢!
$objs=$fullText | foreach{
$tokens= $_.Split(‘ ‘,[StringSplitOptions]::RemoveEmptyEntries)
‘”{0}”‘ -f [string]::Join(‘”,”‘,$tokens)
} | ConvertFrom-Csv
同时还有一个问题,一直在看博主的博客,对poweshell的编写风格,语法有了一定了解,但是一直存在一些困难,就是对于一些函数,或者com对象很陌生,甚至不知道他们的存在,请问我可以从哪些途径学习呢?谢谢!