如何仅在空行上拆分

How to split only on empty line

假设我有一个这样的 .txt 文件:

abc:def ghi:jkl
xyz-www fff

grz,ggg,ewqe
dgokd fddfs

ssokpwe_klk

我想要的是将其读入 PowerShell,并将每个空行拆分为对象,所以最后我应该在一个数组中包含三个对象,如下所示:

# Object 1
abc:def ghi:jkl
xyz-www fff
#Object 2
grz,ggg,ewqe
dgokd fddfs
#Object3
ssokpwe_klk

我尝试了以下方法:

通过这三种方式读入文件:

Get-Content "D:\a.txt"
Get-Content "D:\a.txt" -Raw
Get-Content "D:\a.txt" | Out-String

又分为以下几种方式:

.split("\n{2,}")
.split(([System.Environment]::NewLine + [System.Environment]::NewLine))
.split("\r\n\r\n")

然而,它总是不仅在空白的白线上分裂,而且在对象内部也分裂。

我怎样才能真正只在空行上拆分,我需要如何读取我的内容?

$file = Get-Content -Path "file.txt"
$objects = New-Object Collections.Generic.List[System.String]
$lines = [System.String]::Empty
foreach ($line in $file) {  
    if ([System.String]::IsNullOrWhiteSpace($line)) {
        if (![System.String]::IsNullOrWhiteSpace($lines)) {
            $objects.Add($lines)
        }
        $lines = [System.String]::Empty
    }
    else {
        if ([System.String]::IsNullOrWhiteSpace($lines)) {
            $lines = $line
        }
        else {
            $lines = "$lines$([System.Environment]::NewLine)$line"
        }
    }
}
if (![System.String]::IsNullOrWhiteSpace($lines)) {
    $objects.Add($lines)
}

#Printing all objects
$n = 1
foreach ($value in $objects) {
    Write-Host "█ Object $($n):"
    Write-Host $value
    Write-Host
    $n += 1
}

输出

█ Object 1:
abc:def ghi:jkl
xyz-www fff

█ Object 2:
grz,ggg,ewqe
dgokd fddfs

█ Object 3:
ssokpwe_klk

使用以下输入进行测试


"abc:def ghi:jkl
xyz-www fff

grz,ggg,ewqe
dgokd fddfs

ssokpwe_klk"

"abc:def ghi:jkl
xyz-www fff

grz,ggg,ewqe
dgokd fddfs



ssokpwe_klk"

"abc:def ghi:jkl
xyz-www fff

grz,ggg,ewqe
dgokd fddfs

ssokpwe_klk

"

您可以使用 -split 运算符执行以下操作:

(Get-Content a.txt -Raw) -split '(?:\r?\n){2,}'

解释:

使用-Raw 开关将文件作为一个字符串读取。 (?:) 是一个非捕获组,因此匹配的换行符在拆分时被删除。空行可能只是换行符(CR 匹配 \r and/or LF 匹配 \n)。如果您的文件中没有 CR 字符,\r? 仍然会匹配。 {2,} 匹配两个或多个上一个匹配项。

使用 .Split() 方法,您不能使用正则表达式语法,因为它不解释它。 Split(Params char[] separator) 重载无法识别连续的字符序列。它使用每个输入字符串作为字符数组。然后它将为每个匹配的字符应用拆分。所以 'hithereagain'.Split('there')'hithereagain'.Split('eerth').

的结果相同