首页 > 解决方案 > Powershell - 计算.txt文件中的回车换行数

问题描述

我有一个大文本文件(从 SQL db 输出),我需要确定行数。但是,由于源 SQL 数据本身包含回车符\r和换行符\n(从不一起出现),因此某些行的数据跨越输出 .txt 文件中的多行。我在下面使用的 Powershell 为我提供了大于实际 SQL 行数的文件行数。所以我需要修改脚本以忽略额外的行 - 一种方法可能只是计算文件中的次数CRLF\r\n发生次数(TOGETHER),这应该是实际的行数,但我不确定如何去做吧。

Get-ChildItem "." |% {$n = $_; $c = 0; Get-Content -Path $_ -ReadCount 1000 |% { $c += $_.Count }; "$n; $c"} > row_count.txt

标签: powershell

解决方案


我刚刚了解到,Get-Content文件中的每一行通过CRCRLF和拆分和流式传输,LF以便它可以在操作系统之间互换读取数据:

"1`r2`n3`r`n4" | Out-File .\Test.txt
(Get-Content .\Test.txt).Count
4

再次阅读问题,我可能误解了您的问题。
在任何情况下,如果您只想在特定字符组合上拆分(计数):

((Get-Content -Raw .\Test.txt).Trim() -Split '\r').Count
3

如果

((Get-Content -Raw .\Test.txt).Trim() -Split '\n').Count
3

CRLF

((Get-Content -Raw .\Test.txt).Trim() -Split '\r\n').Count # or: -Split [Environment]::NewLine
2

注意删除参数.Trim()添加的文件末尾的额外换行符(空格)的方法。Get-Content -Raw


附录

(根据对内存异常的评论进行更新)
恐怕目前没有其他选择,然后使用ReadBlock方法构建自己的StreamReader并专门在 CRLF 上拆分行。我已经为此问题打开了一个功能请求:-NewLine Parameter to customize line separator for Get-Content

获取线

解决内存异常错误的一种可能方法:

function Get-Lines {
    [CmdletBinding()][OutputType([string])] param(
        [Parameter(ValueFromPipeLine = $True)][string] $Filename,
        [String] $NewLine = [Environment]::NewLine
    )
    Begin {
        [Char[]] $Buffer = new-object Char[] 10
        $Reader = New-Object -TypeName System.IO.StreamReader -ArgumentList (Get-Item($Filename))
        $Rest = '' # Note that a multiple character newline (as CRLF) could be split at the end of the buffer
    }
    Process {
       While ($True) {
            $Length = $Reader.ReadBlock($Buffer, 0, $Buffer.Length)
            if (!$length) { Break }
            $Split = ($Rest + [string]::new($Buffer[0..($Length - 1)])) -Split $NewLine
            If ($Split.Count -gt 1) { $Split[0..($Split.Count - 2)] }
            $Rest = $Split[-1]
        }
    }
    End {
        $Rest
    }
}

用法

为防止内存异常,请务必不要将结果分配给变量或使用方括号,因为这将停止 PowerShell PowerShell 管道并将所有内容存储在内存中。

$Count = 0
Get-Lines .\Test.txt | ForEach-Object { $Count++ }
$Count

推荐阅读