Powershell 当多行字符串的最后一行为空/空白时,如何有效地删除该行?

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

我试图从每个sqlcmd输出文件中删除底部的空行,由其他供应商提供

$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文件,可以假定它足够小

注:

  • 我所说的空行是指完全为空或仅包含空格(新行除外)的行

  • 修剪后的字符串在最后一行之后不会有一个最终终止的换行符,但如果将其传递给
    设置内容
    (或
    输出文件
    ),则默认情况下会追加一个换行符;使用
    -NoNewline
    来抑制这种情况,但不要抑制这种情况,尤其是在类Unix平台上,即使最后一行文本文件也应该有一个尾随的换行符

  • 非空行上的尾随(或前导)空格按设计不修剪,除非另有说明

  • 这些解决方案使用在上运行的

删除所有尾随空行

(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]
    匹配空格和制表符,而
    \s
    通常匹配所有形式的Unicode空格,包括ASCII范围之外的空格

  • 在这种情况下,文件末尾的可选尾随换行符(用于终止最后一行)不被视为空行—无论是否存在这样的换行符都不会产生任何影响


无条件删除最后一行,无论它是否为空:

(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'