I have a Powershell script that reads lines and then writes line count in a .csv file. The script skips the first 8 lines (header of the file) and counts the remaining lines to get the count of lines.
Script
$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
}
Problem
Sometimes the file header doesn't limit to the first 8 lines. It gets extended to 11 or 15 lines depending on the information/comments in the header.
This gives a wrong count of the total lines because the need is to count lines only after the end of the header.
Each file header ends with the text "END OF HEADER".
How to modify the script to start counting lines only after the text "END OF HEADER".
File Header
the actual file doesn't have 1., 2., 3. numbering, I have added it here for line count reference only
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
CodePudding user response:
Instead of using Select -Skip
, use the intrinsic .Where()
method in SkipUntil
mode - this will ignore all lines prior to the line containing END OF HEADER
and the count of post-header lines is thus the count minus 1:
@{ Name = "LineCount"; Expression = {
(Get-Content -Path $_.FullName).Where({$_ -match '\bEND OF HEADER\b'}, 'SkipUntil').Count - 1
}}
CodePudding user response:
Try following :
$subDir = @("c:\temp\")
$table = [System.Collections.ArrayList]::new()
foreach($sub in $subDir) {
$text = Get-Content -Path ($sub "test.txt")
$newRow = New-Object -TypeName psobject
$dashLine = $text | select-string -Pattern "---------------" |select LineNumber
$totalLines = $text | Measure-Object –Line
$newRow | Add-Member -NotePropertyName NumberLines -NotePropertyValue ($totalLines.Lines - $dashLine.LineNumber)
$table.Add($newRow) | Out-Null
}
$table | Export-Csv "C:\temp\$test.csv" -NoTypeInformation