我目前需要一种针对我们自动化脚本的解决方案。作为该过程的一部分,它从源中获取文件,并且必须删除.csv中的最后一行并将其再次另存为csv文件(不确定为什么必须这样做,因为文件已经是.csv了,但是没有它-错误)。问题是我似乎无法弄清楚如何删除最后一行。我提出了几种解决方案,但大多数只适用于.txt文件或对象。我现在所拥有的是:
Import-Csv $file | where {$_.'Search Status' -ne "Blank line"} | Export-Csv "\file.csv" -notypeinfo
它确实删除了写有“空白行”的最后一行,但是它似乎只是删除了文本,而当我的其他脚本解析文件时,它不能正确执行此操作。因此,总而言之-我需要一个脚本来接收该文件,完全删除最后一行并将其再次保存为.csv,因为'export-csv'似乎不起作用。
答案 0 :(得分:5)
在 PSv5 + 中,您可以使用Select-Object
的{{1}}参数:
-SkipLast
请注意,我只是使用Get-Content $file | Select-Object -SkipLast 1 | Set-Content out.csv -Encoding UTF8
而不是Get-Content
,因为没有充分的理由招致Import-Csv
的开销(为每个输入行构造一个自定义对象),并且随后的Import-Csv
(将每个自定义对象序列化为单个字符串中的逗号分隔的值列表),如果唯一需要执行的任务是整体上放置一行。
还要注意,我包含了一个Export-Csv
参数来说明您可能要显式控制输出编码的观点,因为输入编码从未在PowerShell中保留。
-Encoding
在Windows PowerShell上默认为“ ANSI”编码,在PowerShell Core上默认为无BOM的UTF-8。
在 PSv4-中,您可以采用以下技术来模拟Set-Content
;它也使您可以在一次通过中完成相同的操作,而无需将整个输入文件加载到内存中:
-SkipLast 1
以上只是将管道输入对象的输出延迟了一次迭代,从而有效地省略了 last 输入对象。
答案 1 :(得分:0)
您可以将文件加载到对象中,删除最后一行,然后重新编写:
$f = @(Get-Content -Path $file)
[array]::Reverse($f)
$f = $f | Select-Object -Skip 1
[array]::Reverse($f)
$f | Out-File -FilePath $file
注意:这对我来说非常懒惰(并且表现很差),因为我没有花更多的时间考虑它,但是它可以完成工作。
答案 2 :(得分:0)
@Directive({
selector: '[askGenerateVariable]'
})
export class GenerateVariableDirective {
constructor(private element: ElementRef) { }
@HostListener('keydown', ['$event']) onKeyDown(e: KeyboardEvent) {
if (e.ctrlKey && (e.key === '1' || e.key === '2' || e.key === '3' || e.key === '4')) {
...
}
}
}
答案 3 :(得分:0)
或
$x = @(Get-Content -Path $file)
($x[0..($x.Length - 2)]) | Out-File -FilePath $file
避免两次执行[array]::Reverse()
答案 4 :(得分:0)
根据您的Powershell版本,您可以仅使用Select-Object的skiplast参数
environment.ts