我有一些文本文件,Powershell 可以快速处理,但前提是行数足够短(少于 4,000 个字符)。
如果我的文本文件的任何一行都有超过 8,000 个字符,那么通常需要 20 秒的时间可能需要 6 个小时!
是否有一个简单的 Powershell 命令可以删除任何超过 4,000 个字符的行?
编辑:在批处理文件中运行,这看起来应该可以工作,但实际上却不行(根据下面 Keith Miller 的回答,适合在批处理文件中使用)
start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem '*.txt' | ForEach-Object { $skipped = 0 $file = $_.FullName $result = switch -File $file { { $_.Length -le 4000 } { $_ } default { $skipped++ } } if ($skipped) $result | Set-Content -Path $file -Force} }"
答案1
我使用这个(在批处理文件中)让它工作
start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem '*.txt' | ForEach-Object {(Get-Content $_) | Where-Object {$_.Length -lt 4000} | Set-Content $_.FullName}"
Keith Miller 首先回答了这个问题,但答案在已发布的评论中,所以我无法将其标记为已解决。也感谢 Theo。
答案2
您可以使用switch -File
逐行循环遍历文件内容来以最快的速度完成此操作,当发现长度超过 4000 个字符的行时,只需跳过它们:
(Get-ChildItem -Path 'Path\To\The\Files' -Filter '*.txt' -File) | ForEach-Object {
$skipped = 0
$file = $_.FullName
$result = switch -File $file {
{ $_.Length -le 4000 } { $_ } # only output lines that are less or equal to 4000 characters
default { $skipped++ } # count the lines that were longer than 4000 characters
}
if ($skipped) {
# rewrite the file only if there were lines removed
Write-Host "Replacing file '$file'"
$result | Set-Content -Path $file -Force
}
}
括号内的括号Get-ChildItem
用于强制在处理文件之前完成文件枚举。否则,Get-ChildItem 可能会拾取已被重写的文件