使用Powershell删除.csv文件中的最后一行

时间:2018-07-20 19:46:32

标签: powershell csv scripting

我目前需要一种针对我们自动化脚本的解决方案。作为该过程的一部分,它从源中获取文件,并且必须删除.csv中的最后一行并将其再次另存为csv文件(不确定为什么必须这样做,因为文件已经是.csv了,但是没有它-错误)。问题是我似乎无法弄清楚如何删除最后一行。我提出了几种解决方案,但大多数只适用于.txt文件或对象。我现在所拥有的是:

Import-Csv $file | where {$_.'Search Status' -ne "Blank line"} | Export-Csv "\file.csv" -notypeinfo

它确实删除了写有“空白行”的最后一行,但是它似乎只是删除了文本,而当我的其他脚本解析文件时,它不能正确执行此操作。因此,总而言之-我需要一个脚本来接收该文件,完全删除最后一行并将其再次保存为.csv,因为'export-csv'似乎不起作用。

5 个答案:

答案 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)

  • 导入csv
  • 获取商品数
  • 选择第一行(计数-1)
  • 导出

@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