Чтение файла, подсчет разделителей и выходной номер строки с несовпадающим разделителем - PullRequest
1 голос
/ 14 февраля 2020

У меня есть файл с именем: test_file.txt. Вторая строка имеет 4 разделителя трубы, а все остальные строки, кроме 2-й строки, имеют 3 разделителя трубы. Я просто хочу вывести строку 2, поскольку она имеет еще один разделитель, чем другие строки.

$colCnt = "C:\test.txt"
[int]$LastSplitCount = $Null
Get-Content $colCnt | ?{$_} | Select -Skip 1 | %{if($LastSplitCount -and !

($_.split("|").Count -eq $LastSplitCount))

{"Process stopped at line number $($_.psobject.Properties.value[5]) for column count mis-match.";break}

elseif(!$LastSplitCount){$LastSplitCount = $_.split("|").Count}}

1 Ответ

1 голос
/ 15 февраля 2020

Если ваш текстовый файл выглядит примерно так:

blah|using|three|delimiters
blah|using|four |delimiter |characters
blah|using|three|delimiters
blah|using|four |delimiter |characters
blah|using two  |delimiters

Следующий код должен выводить строки с более (или менее), чем 3 | разделителями:

$line = 0
switch -Regex -File "C:\test.txt" {
    '^(?:[^|]*\|){3}[^|]*$' { $line++ }   # this line is OK, just increase the line counter
    default { "Bad delimiter count in line {0}: '{1}'" -f ++$line, $_ }
}

Вывод:

Bad delimiter count in line 2: 'blah|using|four |delimiter |characters'
Bad delimiter count in line 4: 'blah|using|four |delimiter |characters'
Bad delimiter count in line 5: 'blah|using two  |delimiters'

Регулярное выражение:

^           Assert position at the beginning of the string
(?:         Match the regular expression below
   [^|]     Match any character that is NOT a “|”
      *     Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
   \|       Match the character “|” literally
){3}        Exactly 3 times
[^|]        Match any character that is NOT a “|”
   *        Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
$           Assert position at the end of the string (or before the line break at the end of the string, if any)
...