如何仅在空行上拆分
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')
.
的结果相同
假设我有一个这样的 .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')
.