修改PowerShell脚本:基于END OF HEADER统计日志有效行数
问题与解决方案
问题描述
原PowerShell脚本用于遍历指定目录下的子目录,读取每个.log文件的行数(固定跳过前8行头部)并将结果写入对应子目录名称的CSV文件。但日志文件的头部行数不固定,会根据内容扩展到11行或15行,且所有文件的头部均以文本END OF HEADER结尾,导致固定跳过8行的统计方式出错。需求改为仅统计END OF HEADER之后的有效数据行数。
原脚本
$targDir = "C:\Logs\15Sec\Ref.Data\Month\"; $subDir = $(Get-ChildItem "$targDir" –Directory ); foreach($sub in $subDir) { Get-ChildItem -Path $sub –Recurse *.log | Select-Object -Property @( 'FullName' @{ Name = "LineCount"; Expression = { (Get-Content -Path $_.FullName | Select-Object -Skip 8 | Measure-Object).Count }} ) | Export-Csv "C:\test\$($sub.Name).csv" -NoTypeInformation }
日志文件头部示例
1. 3.03 MET DATA RINEX VERSION / TYPE 2. cnvtToRINEX 3.14.0 convertToRINEX OPR 20220511 072939 UTC PGM / RUN BY / DATE 3. ----------------------------------------------------------- COMMENT 4. XYXTY3 MARKER NAME 5. UBWTZ3 MARKER NUMBER 6. 3 PR TD HR # / TYPES OF OBSERV 7. 0083019.4060 0025010.0967 0253356.6176 0.0000 PR SENSOR POS XYZ/H 8. END OF HEADER 9. 19 03 02 00 00 00 946.0 8.5 93.0 10. 19 03 02 00 05 00 946.0 8.4 93.4 11. 19 03 02 00 10 00 946.0 8.4 93.4 12. 19 03 02 00 15 00 946.0 8.4 94.2
修改后的脚本
$targDir = "C:\Logs\15Sec\Ref.Data\Month\"; $subDir = Get-ChildItem "$targDir" –Directory; foreach($sub in $subDir) { Get-ChildItem -Path $sub –Recurse *.log | Select-Object -Property @( 'FullName' @{ Name = "LineCount"; Expression = { $lines = Get-Content -Path $_.FullName # 定位"END OF HEADER"所在行的行号 $headerEndLine = ($lines | Select-String "END OF HEADER").LineNumber # 跳过头部结束行及之前的所有行,统计剩余行数 ($lines | Select-Object -Skip $headerEndLine).Count }} ) | Export-Csv "C:\test\$($sub.Name).csv" -NoTypeInformation }
关键改动说明
- 动态定位头部结束位置:通过
Select-String查找包含END OF HEADER的行,获取其行号,替代固定跳过8行的逻辑。 - 优化IO效率:将文件内容一次性读取到变量
$lines中,避免重复读取文件。 - 精准统计数据行:使用
Select-Object -Skip $headerEndLine直接跳过头部所有行(包括END OF HEADER所在行),仅统计后续有效数据的行数。
内容的提问来源于stack exchange,提问作者Hawfinch Taylor
相关产品推荐
相关产品推荐

