Dmi*_*min 4 csv powershell scripting
我目前需要一个自动化脚本的解决方案.作为进程的一部分,它从源获取文件,并且必须删除.csv中的最后一行并将其再次保存为csv文件(不知道为什么必须这样做,因为文件已经作为.csv,但没有它 - 它错了).问题是我似乎无法弄清楚如何删除最后一行.我想出了一些解决方案,但大多数只能处理.txt文件或对象.我现在拥有的是:
Import-Csv $file | where {$_.'Search Status' -ne "Blank line"} | Export-Csv "\file.csv" -notypeinfo
Run Code Online (Sandbox Code Playgroud)
它确实删除了写在其中的"空行"的最后一行,但它似乎只删除了文本,当我的其他脚本解析文件时,它无法正确执行.总而言之 - 我需要一个可以获取此文件的脚本,完全删除最后一行并将其再次保存为.csv,因为'export-csv'似乎不能完成这项工作.
在PSv5 +中你可以使用Select-Object的-SkipLast参数:
Get-Content $file | Select-Object -SkipLast 1 | Set-Content out.csv -Encoding UTF8
Run Code Online (Sandbox Code Playgroud)
请注意,我只是使用Get-Content而不是Import-Csv,因为没有充分的理由可以产生Import-Csv(为每个输入行构建自定义对象)和后续Export-Csv(将每个自定义对象序列化为单个逗号分隔的值列表) string)如果所需的唯一任务是删除整行.
另请注意,我已经包含一个-Encoding参数来说明您可能希望显式控制输出编码,因为输入编码永远不会保留在PowerShell中.
Set-Content将在Windows PowerShell上默认为"ANSI"编码,在PowerShell Core上默认为无BOM的UTF-8.
在PSv4-中,您可以使用以下技术来模拟-SkipLast 1; 它允许您在单个传递中执行相同操作,而无需将整个输入文件加载到内存中:
Get-Content $file | ForEach-Object { $prev = $null } {
if ($null -ne $prev) { $prev }
$prev = $_
} | Set-Content out.csv -Encoding UTF8
Run Code Online (Sandbox Code Playgroud)
以上简单地将管道输入对象的输出延迟一次迭代,这有效地省略了最后一个输入对象.