Powershell 当多行字符串的最后一行为空/空白时,如何有效地删除该行?
我试图从每个sqlcmd输出文件中删除底部的空行,由其他供应商提供Powershell 当多行字符串的最后一行为空/空白时,如何有效地删除该行?,powershell,Powershell,我试图从每个sqlcmd输出文件中删除底部的空行,由其他供应商提供 $List=Get-ChildItem * -include *.csv foreach($file in $List) { $data = Get-Content $file $name = $file.name $length = $data.length -1 $data[$length] = $null
$List=Get-ChildItem * -include *.csv
foreach($file in $List) {
$data = Get-Content $file
$name = $file.name
$length = $data.length -1
$data[$length] = $null
$data | Out-File $name -Encoding utf8
}
删除空白行需要很长时间。有人知道更有效的方法吗?试着用这一行替换。数组值$data中不会有空行
$data = get-content $file.FullPath | Where-Object {$_.trim() -ne "" }
使用
Get Content-Raw
将文件作为一个整体加载到内存中,并对该字符串进行操作,可以最大限度地提高速度。
虽然这并不总是一个取决于文件大小的选项,但您提到了sqlcmd文件,可以假定它足够小
注:
- 我所说的空行是指完全为空或仅包含空格(新行除外)的行
- 修剪后的字符串在最后一行之后不会有一个最终终止的换行符,但如果将其传递给
(或设置内容
),则默认情况下会追加一个换行符;使用输出文件
来抑制这种情况,但不要抑制这种情况,尤其是在类Unix平台上,即使最后一行文本文件也应该有一个尾随的换行符-NoNewline
- 非空行上的尾随(或前导)空格按设计不修剪,除非另有说明
- 这些解决方案使用在上运行的
(Get-Content -Raw $file) -replace '\r?\n[ \t]*\Z'
注意:如果您确实希望仅删除最后一行(如果它恰好为空),请参阅下面倒数第二个解决方案
在命令的上下文中(稍微修改):
注意:上面命令中的预览操作。一旦确定操作将执行所需操作,请删除-WhatIf
如果可以/希望从最后一个非空行中删除尾随空格,您可以更简单地写:
(Get-Content -Raw $file).TrimEnd()
删除文件中出现的所有空行:
(Get-Content -Raw $file) -replace '(?m)\A\s*\r?\n|\r?\n\s*$'
这是一个概念上简单得多的版本,它在Get Content
输出的行数组上运行,而不使用-Raw
(还返回一个数组),但它的性能要差得多
@(Get-Content $file) -notmatch '^\s*$'
不要将其与设置内容
/输出内容
-NoNewline
相结合,因为这将直接连接存储在数组元素中的行,而不会在它们之间出现换行符。如果没有-NoNewline
,则在最后一行之后总会有一个终止换行符
仅删除最后一行(如果为空):
(Get-Content -Raw $file) -replace '\r?\n[ \t]*\Z'
注:
匹配空格和制表符,而[\t]
通常匹配所有形式的Unicode空格,包括ASCII范围之外的空格\s
- 在这种情况下,文件末尾的可选尾随换行符(用于终止最后一行)不被视为空行—无论是否存在这样的换行符都不会产生任何影响
无条件删除最后一行,无论它是否为空:
(Get-Content -Raw $file) -replace '\r?\n[^\n]*\Z'
注:
- 在这种情况下,文件末尾的可选尾随换行符(用于终止最后一行)不被视为空行—无论是否存在这样的换行符都不会产生任何影响
- 如果要删除最后一个非空行,请使用
(获取内容-原始$file).TrimEnd()-替换'\r?\n[^\n]*\Z'
注意,这将替换文本文件中的所有空行,即使它们出现在中间。我同意@ BACON位,这将删除所有空行,只删除尾部(<代码> .TrimEnter()/代码>)和/或引导(<代码> .TrimScript()/代码>)空行,您可以简单地做:<代码> $data =(get内容$Fiel.FultPATH -ALL).Times()我想你指的是
-Raw
,而不是-All
,@iRon.TrimEnd()
当然非常简单,但请注意,它还将从最后一个非空行中删除任何尾随空格,这可能是可以接受的,也可能是不可以接受的。如果是,它可能是最快的PowerShell唯一解决方案。至于这个答案(撇开它所做的事情与所说的提问不同不谈):逐行阅读,结合管道和Where Object
,这是一个非常缓慢的解决方案(即使它比问题中的解决方案快)。我的荣幸,@Sachiko。
(Get-Content -Raw $file) -replace '\r?\n[^\n]*\Z'