读取文件,对分隔符进行计数,并使用不匹配的分隔符输出行号



我有一个名为:test_file.txt的文件。第二行有 4 个管道分隔符,除第二行外的所有其他行都有 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}}

如果你的文本文件看起来像这样:

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'

正则表达式详细信息:

^ 字符串开头的断言位置 (?:匹配下面的正则表达式  [^|]    匹配任何不是"|"的字符 *在零次和无限次之间,尽可能多地回馈,根据需要回馈(贪婪(  \|      从字面上匹配字符"|" ({3} 正好 3 次 [^|]       匹配任何不是"|"的字符  *在零次和无限次之间,尽可能多地回馈,根据需要回馈(贪婪( $ 断言字符串末尾的位置(或字符串末尾的换行符之前,如果有(

最新更新