我目前需要为我们的自动化脚本之一的解决方案。作为该过程的一部分,它从源文件中抓取文件,并删除.csv中的最后一行,并将其再次保存为csv文件(不知道为什么要这样做,因为文件已经是.csv,但没有它-它错误)。问题是我似乎不知道如何删除最后一行。我想出了几个解决方案,但大多数只适用于.txt文件或对象。我现在有这个:
Import-Csv $file | where {$_.'Search Status' -ne "Blank line"} | Export-Csv "\file.csv" -notypeinfo
它确实删除了最后一行写有“空行”的内容,但它似乎只是删除了文本,当我的其他脚本解析文件时,它无法正确执行。因此,总结-我需要一个脚本,将此文件,完全删除最后一行,并再次保存为.csv作为“导出-csv”似乎没有做这项工作。
6条答案
按热度按时间wz1wpwve1#
在**PSv 5 +**中可以使用
Select-Object
的-SkipLast
参数:请注意,我只是使用
Get-Content
而不是Import-Csv
,因为如果所需的唯一任务是作为一个整体删除一行,那么没有充分的理由招致Import-Csv
(为每个输入行构造一个自定义对象)和随后的Export-Csv
(将每个自定义对象序列化为一个逗号分隔的值列表)的开销。另外请注意,我已经包含了一个
-Encoding
参数,以说明您可能希望显式控制输出编码的观点,因为输入编码永远不会保留在PowerShell中。Set-Content
在Windows PowerShell上默认为“ANSI”编码,在PowerShell Core上默认为无BOM的UTF-8编码。在**PSv 4-**中,您可以使用以下技术模拟
-SkipLast 1
:它也允许你在一次传递中做同样的事情,而不需要将整个输入文件加载到内存中:上面简单地将流水线输入对象的输出延迟一次迭代,这有效地省略了 last 输入对象。
gkl3eglg2#
laawzig23#
还是
以保存执行
[array]::Reverse()
两次1tuwyuhd4#
您可以将文件加载到对象中,删除最后一行,然后重写它:
注意:这对我来说是非常懒惰的(并且表现很差),因为我没有花更多的时间来考虑它,但它完成了工作。
v6ylcynt5#
根据您的powershell版本,您可以只使用Select-Object的skiplast参数
hmae6n7t6#
我们有一些额外的要求,例如能够检查文件夹中的多个文件,并确保第一行中的列数与最后一行中的列数相匹配。有时文件在传输过程中会中断,并在文件中留下最后一个不完整的行。在这里发布我们的解决方案,以防它可能会帮助其他人: